我如何从我的 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/)