[英]Django CreateView - created_by, modified_by mixin not working
我已按照CBV上的spapas教程進行操作,並嘗試在創建視圖上應用mixin。 但是看起來它不能正確評估用戶外鍵的if not form.invoice.requester,因為它總是說:RelatedObjectDoesNotExist,它指向if not行中評估的字段。
有什么事嗎
class AuditableMixin(object, ):
def form_valid(self, form, ):
if not form.instance.requester:
form.instance.requester = self.request.user
form.instance.modified_by = self.request.user
return super().form_valid(form)
class NewOrderView(LoginRequiredMixin, PermissionRequiredMixin, AuditableMixin, generic.CreateView):
permission_required = 'orders.add_order'
form_class = NewOrderForm
model = Order
title = 'New Order'
extra_context = {'title': title}
class NewOrderForm(forms.ModelForm):
class Meta:
model = Order
widgets = {
'order_details': forms.Textarea,
}
exclude = (
'status',
'invoice',
'requester',
'modified_by',
)
class Order(models.Model):
STATUS_CHOICES = (
('open', 'Open'),
('inprogress', 'In Progress'),
('rejected', 'Rejected'),
('closed','Closed'),
('resolved','Resolved'),
)
subject = models.CharField(
max_length=30,
)
requester = models.ForeignKey(
User,
on_delete=models.PROTECT,
related_name='orders',
)
order_details = models.TextField(
)
created = models.DateTimeField(
auto_now_add=True,
)
updated = models.DateTimeField(
auto_now=True,
)
status = models.CharField(
max_length=12,
default='open',
choices= STATUS_CHOICES,
)
invoice = models.ForeignKey(
Invoice,
on_delete=models.PROTECT,
blank= True,
null=True,
related_name='orders',
)
modified_by = models.ForeignKey(
User,
on_delete=models.PROTECT,
related_name='orders_modified',
)
def __str__(self):
return self.subject
def get_absolute_url(self):
return reverse('Order_Detail', args=[str(self.pk)])
class Meta:
ordering = ['-created']
謝謝。
在模型上調用ForeignKey對象時,實際上是在告訴Django執行查詢以獲取相關對象。 要檢查該關系是否存在,應檢查<fieldname>_id
,它是<fieldname>_id
的實際名稱:
if not form.instance.requester_id:
form.instance.requester = self.request.user
這樣,如果requester_id
為None
您不會執行查詢,這將通過RelatedObjectDoesNotExist
錯誤進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.