gpt4 book ai didi

python - Django一对一字段RelatedObjectDoesNotExist

转载 作者:太空宇宙 更新时间:2023-11-03 14:14:06 25 4
gpt4 key购买 nike

我制作了这些模型:

class Post(models.Model):
title = models.CharField(max_length=50, blank=True, null=True)

class OrderInfo(models.Model):
post = models.OneToOneField(Post, on_delete=models.CASCADE, primary_key=True)
position = models.CharField(max_length=50, blank=True, null=True)

@receiver(post_save, sender=Post)
def update_order_info(sender, instance, created, **kwargs):
if created:
OrderInfo.objects.create(post=instance)
instance.orderinfo.save()

在 View 中,

class OrderPostWriteView(FormView):
form_class = OrderPostForm
template_name = 'board/order/order_post_write.html'
success_url = '/index/'

def form_valid(self, form):
form_class = self.get_form_class()
form = self.get_form(form_class)

if form.is_valid():
post = form.save(commit=False)
post.orderinfo.position= form.cleaned_data.get('position')

post.save()
return redirect('index')
else:
return render(self.request, 'board/order/order_post_write.html', {'form': form})

表单.py:

class OrderPostForm(forms.ModelForm):
position = forms.CharField()
class Meta:
model = Post
fields = ('title', 'position')

并且它返回RelatedObjectDoesNotExist错误。

帖子没有订单信息。

我该怎么办?

(我认为 Django 系统正在将 .orderinfo 作为帖子的专栏进行处理。但是为什么呢?)

最佳答案

您尝试在创建该对象之前设置相关 orderinfo 的属性。保存帖子时会触发您的信号,但您明确不保存它,因为您使用了 commit=False,因此不会触发信号。

事实上你不需要这样做。只需正常保存对象,让信号触发,然后设置位置即可。您不需要再次保存帖子,但您确实需要保存订单信息。

(如果这是唯一可以创建帖子的地方,您最好完全删除信号并直接在此处创建订单信息,包括位置,这样可以避免保存两次。)

关于python - Django一对一字段RelatedObjectDoesNotExist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48315521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com