[英]Can not assign must be a instance. Django
我下面提到的代碼出現以下錯誤:
無法分配“'1'”:“ OrderInfo.ordertype”必須是“ Orders”實例。
我知道這意味着String
必須是一個instance
(也許是模型對象)
但是,我不知道為什么不允許使用String
。
這是我的代碼。
Models.py :
class OrderInfo(models.Model):
post = models.OneToOneField(Post)
ordertype = models.ForeignKey(Orders)
company = models.CharField(max_length=50, blank=True, null=True)
position = models.CharField(max_length=50, blank=True, null=True)
class Post(models.Model):
board = models.ForeignKey(Board)
writer = models.CharField(max_length=50, blank=True, null=True)
writtendate = models.DateTimeField(blank=True, null=True)
editeddate = models.DateTimeField(blank=True, null=True)
subject = models.CharField(max_length=50, blank=True, null=True)
text = RichTextField()
hits = models.IntegerField(default=0)
class Orders(models.Model):
order = models.CharField(max_length=50, blank=True, null=True)
Forms.py :
class OrderEditForm(forms.ModelForm):
qs = Orders.objects.all()
list = [(order.id, order.order) for order in qs]
##### list's value is [('1', 'A'), ('2', 'B')]
ordertype = forms.CharField(widget=forms.RadioSelect(choices=list))
class Meta:
model = OrderInfo
fields = ('ordertype', 'company', 'position')
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('subject', 'text')
def __init__(self, *args, **kwargs):
super(PostForm, self).__init__(*args, **kwargs)
self.fields['subject'].required = True
views.py
def order_post_edit(request, board_id, post_id):
post = get_object_or_404(Post, id=post_id)
if request.method == "POST":
form = PostForm(request.POST, instance=post)
orderform = OrderEditForm(request.POST, instance=post.orderinfo)
if form.is_valid():
print(request.POST['ordertype'])
print(orderform.fields)
post = form.save(commit=False)
post.editeddate = timezone.now()
post.save()
orderform.save()
return redirect('order_post', board_id=board_id, post_id=post.id)
else:
form = PostForm(instance=post)
orderform = OrderEditForm(instance=post.orderinfo)
return render(request, 'board/order/order_post_edit.html', {'form': form, 'orderform': orderform})
您的問題在這里:
ordertype = forms.CharField(widget=forms.RadioSelect(choices=list))
保存對象時,嘗試保存為訂單類型選擇的字符,而不是該ID的OrderType對象實例。 您可以嘗試:
if form.is_valid():
print(request.POST['ordertype'])
print(orderform.fields)
post = form.save(commit=False)
post.editeddate = timezone.now()
post.save()
orderinfo = orderform.save(commit=False)
orderinfo.ordertype = Orders.objects.get(pk=orderinfo.ordertype)
orderinfo.save()
可能有更好的方法將數據獲取到表單上,以便在選擇數據時將對象實例而不是id的字符串返回給您,但這是一種快速的解決方案。
希望你能解決
您必須使用ModelChoiceField
在你的forms.py
class OrderEditForm(forms.ModelForm):
queryset = Orders.objects.all()
ordertype = forms.ModelChoiceField(queryset=queryset, widget=forms.RadioSelect())
class Meta:
model = OrderInfo
fields = ('ordertype', 'company', 'position')
如果使用Charfield
則經過驗證的值將返回一個字符串。 但是,django需要一個實例。 如果我們使用ModelChoiceField
,它將返回一個實例。 因此,我們不會出錯。
另一種方式:
如果仍要使用CharField,則將字段名稱更改為ordertype_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.