【问题标题】:Django, update value with QuerysetDjango,使用查询集更新值
【发布时间】:2019-12-10 10:58:38
【问题描述】:

我正在尝试使用前端的按钮更新 1 个值。但这不起作用。

首先是一些代码sn-ps。

models.py

    DRAFT = "D"
    PUBLISHED = "P"
    CLOSED = "C"
    STATUS = (
        (DRAFT, _("Draft")),
        (PUBLISHED, _("Published")),
        (CLOSED, _("Closed")),
    )

    class Item(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="itemauthor", on_delete=models.SET_NULL)
        slug = models.SlugField(max_length=80, null=True, blank=True)
        status = models.CharField(max_length=1, choices=STATUS, default=DRAFT)
        ...

views.py

class DeleteItemView(ListView, UpdateView):
    def get_queryset(self):
        Item.objects.filter(pk=self).update(status='C')

urls.py

urlpatterns = [
    ...
    url(r'^delete/(?P<pk>\d+)/$', DeleteItemView.as_view(), name='delete_article'),
    ...
]

.html

a class="btn btn-success" href="{% url 'offers:delete_article' object.pk %}" title="{% trans 'Delete Item' %}"><i class="fa fa-pencil" aria-hidden="true"></i> {% trans 'Delete Item' %}</a>

但这不起作用,我从一个错误跳到下一个错误。 我从 Django 收到此错误消息

int() argument must be a string, a bytes-like object or a number, not 'DeleteItemView'
Request Method: GET
Request URL:    http://127.0.0.1:8000/offers/delete/2/
Django Version: 2.2.2
Exception Type: TypeError
Exception Value:    
int() argument must be a string, a bytes-like object or a number, not 'DeleteItemView'
Exception Location: /home/PycharmProjects/base_camp/venv/lib/python3.7/site-packages/django/db/models/fields/__init__.py in get_prep_value, line 966
Python Executable:  /home/PycharmProjects/base_camp/venv/bin/python
Python Version: 3.7.3

我在哪里犯错了?

【问题讨论】:

    标签: python-3.x django-queryset django-2.2


    【解决方案1】:

    pk 不能是self,应该是self.kwargs['pk']。话虽如此,在这里使用DeleteView 并修补delete 函数可能更有意义,例如:

    from django.views.generic import DeleteView
    
    class DeleteItemView(DeleteView):
    
        model = Item
    
        def delete(self, request, *args, **kwargs):
            self.object = self.get_object()
            success_url = self.get_success_url()
            self.object.status = 'C'
            self.object.save()
            return HttpResponseRedirect(success_url)

    请注意,您需要发出 POST 或 DELETE 请求才能删除对象,因此您可以制作一个迷你表单,例如:

    <form action={% url 'offers:delete_article' object.pk %}" method="post">
        <button type="submit" class="btn btn-success" href=" title="{% trans 'Delete Item' %}"><i class="fa fa-pencil" aria-hidden="true"></i> {% trans 'Delete Item' %}</button>
    </form>

    【讨论】:

    • 感谢您的帮助
    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2021-10-21
    • 2021-08-23
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2020-06-14
    相关资源
    最近更新 更多