我如何从我的 Django 模板调用 class 将行正确插入数据库的函数?
How can i call class function thats insert row into db properly from my django template?
你好,我是菜鸟,我在 Django 上制作 instagram 关注者抓取工具。
我创建了一个函数,它应该将 1 个(只有 1 个,因为它工作起来真的很慢)新的追随者添加到 db 中,它从已经工作的 sсraping 函数中获取并将其放入 class。
class ListOfFollowers(ListView):
model = Followers
context_object_name = 'followers_of'
template_name = 'insta/followers.html'
def get_follower(self, username):
loader = instaloader.Instaloader()
loader.login('***', '***')
profile = instaloader.Profile.from_username(loader.context, username)
followers = profile.get_followers()
followers_tuple = tuple(followers)
i = random.randint(0, len(followers_tuple) - 1)
login = followers_tuple[i].username
photo = followers_tuple[i].get_profile_pic_url()
url = f'https://www.instagram.com/{login}/'
mutual_subscription = followers_tuple[i] in profile.get_followees()
res = {'login': login, 'photo': photo, 'url': url, 'mutual_subscription': mutual_subscription}
return res
def add_followers(self):
username = WhoFollow.objects.get(follow_on__contains=self.kwargs['follow_id']).title
context = None
while not context:
try:
context = get_follower(username)
except:
next
context.update({'follow_on': self.kwargs['follow_id']})
res = Followers(context)
res.save()
def get_queryset(self):
return Followers.objects.filter(follow_on=self.kwargs['follow_id'])
函数调用 add_followers(try 块只是因为它并不总是从第一次尝试开始工作)
我的模特
class WhoFollow(models.Model):
title = models.CharField(max_length=255)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('follow', kwargs={'follow_id': self.pk})
class Followers(models.Model):
login = models.CharField(max_length=255)
photo = models.ImageField(upload_to="photos/", blank=True)
url = models.URLField()
mutual_subscription = models.BooleanField(default=False)
time_add = models.DateTimeField(auto_now_add=True)
time_unfollow = models.DateTimeField(blank=True)
follow_on = models.ForeignKey(WhoFollow, on_delete=models.PROTECT)
def __str__(self):
return self.login
还有我的模板
{% extends 'insta/Base.html' %}
{% block content %}
<h1>Who we find</h1>
<ul>
{% for l in object_list %}
<li>
<h5>{{l.login}}</h5>
</li>
{% endfor %}
</ul>
<!-- from there i dont understand what i should do too -->
<form action="{% url views.ListOfFollowers.}">
<button type="submit" onclick="">add another 1</button>
</form>
{% endblock %}
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', Home.as_view(), name='home'),
path('add/', AddWhoFollow.as_view(), name='add'),
path('follow/<int:follow_id>', ListOfFollowers.as_view(), name='follow'),]
抱歉,代码太多,但我的脑袋已经在这个任务上崩溃了。
您的代码存在一些问题:
首先,您已将 get_follower()
和 add_followers()
这两个方法添加到您的 ListView 中,但不清楚它们是如何调用的(如果有的话)。在我看来,您可能误解了 ListView 的概念。 ListView 的目的是呈现一个对象列表,而不是添加一些东西。因此,您想要创建一个新视图来添加关注者。您可以为此定义一个简单的函数视图,不必是 CBV。
其次,每个视图都需要有自己的 URL 定义。您没有 post 您的 urls.py
,但我想模板中的 {% url views.ListOfFollowers.}
将不起作用。相反,您需要在 urls.py 中定义一个 URL 名称(每个视图一个)并在模板中定义。
我完全误解了 CBV 的概念。
答案是我应该在表单验证后在 CreateVeiw 中执行此操作,我在其中选择要废弃的登录名。
有结果:
class AddFollowers(CreateView):
form_class = AddFollower
model = Followers
template_name = 'insta/add_follower.html'
def get_success_url(self):
return reverse_lazy('home')
def form_valid(self, form):
# Here is a body of scraping script where i creating a list of objects to add in db
Followers.objects.bulk_create(objs=res)
return HttpResponseRedirect(f'http://127.0.0.1:8000/)
你好,我是菜鸟,我在 Django 上制作 instagram 关注者抓取工具。
我创建了一个函数,它应该将 1 个(只有 1 个,因为它工作起来真的很慢)新的追随者添加到 db 中,它从已经工作的 sсraping 函数中获取并将其放入 class。
class ListOfFollowers(ListView):
model = Followers
context_object_name = 'followers_of'
template_name = 'insta/followers.html'
def get_follower(self, username):
loader = instaloader.Instaloader()
loader.login('***', '***')
profile = instaloader.Profile.from_username(loader.context, username)
followers = profile.get_followers()
followers_tuple = tuple(followers)
i = random.randint(0, len(followers_tuple) - 1)
login = followers_tuple[i].username
photo = followers_tuple[i].get_profile_pic_url()
url = f'https://www.instagram.com/{login}/'
mutual_subscription = followers_tuple[i] in profile.get_followees()
res = {'login': login, 'photo': photo, 'url': url, 'mutual_subscription': mutual_subscription}
return res
def add_followers(self):
username = WhoFollow.objects.get(follow_on__contains=self.kwargs['follow_id']).title
context = None
while not context:
try:
context = get_follower(username)
except:
next
context.update({'follow_on': self.kwargs['follow_id']})
res = Followers(context)
res.save()
def get_queryset(self):
return Followers.objects.filter(follow_on=self.kwargs['follow_id'])
函数调用 add_followers(try 块只是因为它并不总是从第一次尝试开始工作)
我的模特
class WhoFollow(models.Model):
title = models.CharField(max_length=255)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('follow', kwargs={'follow_id': self.pk})
class Followers(models.Model):
login = models.CharField(max_length=255)
photo = models.ImageField(upload_to="photos/", blank=True)
url = models.URLField()
mutual_subscription = models.BooleanField(default=False)
time_add = models.DateTimeField(auto_now_add=True)
time_unfollow = models.DateTimeField(blank=True)
follow_on = models.ForeignKey(WhoFollow, on_delete=models.PROTECT)
def __str__(self):
return self.login
还有我的模板
{% extends 'insta/Base.html' %}
{% block content %}
<h1>Who we find</h1>
<ul>
{% for l in object_list %}
<li>
<h5>{{l.login}}</h5>
</li>
{% endfor %}
</ul>
<!-- from there i dont understand what i should do too -->
<form action="{% url views.ListOfFollowers.}">
<button type="submit" onclick="">add another 1</button>
</form>
{% endblock %}
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', Home.as_view(), name='home'),
path('add/', AddWhoFollow.as_view(), name='add'),
path('follow/<int:follow_id>', ListOfFollowers.as_view(), name='follow'),]
抱歉,代码太多,但我的脑袋已经在这个任务上崩溃了。
您的代码存在一些问题:
首先,您已将 get_follower()
和 add_followers()
这两个方法添加到您的 ListView 中,但不清楚它们是如何调用的(如果有的话)。在我看来,您可能误解了 ListView 的概念。 ListView 的目的是呈现一个对象列表,而不是添加一些东西。因此,您想要创建一个新视图来添加关注者。您可以为此定义一个简单的函数视图,不必是 CBV。
其次,每个视图都需要有自己的 URL 定义。您没有 post 您的 urls.py
,但我想模板中的 {% url views.ListOfFollowers.}
将不起作用。相反,您需要在 urls.py 中定义一个 URL 名称(每个视图一个)并在模板中定义。
我完全误解了 CBV 的概念。
答案是我应该在表单验证后在 CreateVeiw 中执行此操作,我在其中选择要废弃的登录名。
有结果:
class AddFollowers(CreateView):
form_class = AddFollower
model = Followers
template_name = 'insta/add_follower.html'
def get_success_url(self):
return reverse_lazy('home')
def form_valid(self, form):
# Here is a body of scraping script where i creating a list of objects to add in db
Followers.objects.bulk_create(objs=res)
return HttpResponseRedirect(f'http://127.0.0.1:8000/)