Django,使用查询集更新值
Django, update value with Queryset
我正在尝试使用前端的按钮更新 1 个值。但这是行不通的。
首先是一些代码片段。
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
我哪里错了?
pk
不能是self
,应该是self.kwargs['pk']
。也就是说,在这里使用 DeleteView
并修补 delete
函数可能更有意义,例如:
from django.views.generic import <b>DeleteView</b>
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 <b>action={% url 'offers:delete_article' object.pk %}" method="post"</b>>
<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>
我正在尝试使用前端的按钮更新 1 个值。但这是行不通的。
首先是一些代码片段。
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
我哪里错了?
pk
不能是self
,应该是self.kwargs['pk']
。也就是说,在这里使用 DeleteView
并修补 delete
函数可能更有意义,例如:
from django.views.generic import <b>DeleteView</b>
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 <b>action={% url 'offers:delete_article' object.pk %}" method="post"</b>>
<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>