簡體   English   中英

不能分配必須是實例。 Django的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM