【问题标题】:"Select a valid choice." Error using Modelform in Django“选择一个有效的选项。”在 Django 中使用 Modelform 时出错
【发布时间】:2016-08-20 12:37:55
【问题描述】:

我不明白为什么我一直收到这个错误:

“选择一个有效的选项。该选项不是可用选项之一。” 错误消息属于“帐户”字段

这是我的模型:

class Account(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    balance = models.FloatField()
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Entry(models.Model):
    account = models.ForeignKey("Account", on_delete=models.CASCADE)
    amount = models.FloatField()
    expense = models.BooleanField(default=True)
    date = models.DateTimeField()
    usage = models.CharField(max_length=200, blank=True)
    payment_method = models.ForeignKey("PaymentMethod",    on_delete=models.CASCADE)
    category = models.ForeignKey("Category", on_delete=models.CASCADE)

    def __str__(self):
        return "{} - {}".format(self.date, self.account)

我的看法:

class AddExpenseView(View):
    template_name = "finance/create_booking.html"
    form_class = CreateBookingForm

    @method_decorator(login_required)
    def get(self, request):
        context = {
            "title": "StatYourLife - Neue Ausgabe",
            "create_booking_form": self.form_class(user=request.user)
        }

        return render(request, self.template_name, context)
    @method_decorator(login_required)
    def post(self, request):
        form = self.form_class(request.POST)
        if form.is_valid():
            user_profile = UserProfile.objects.get(user_id=request.user)
            booking = form.save(commit=False)
            account = booking.account
            account.balance -= booking.amount
            booking.expense = True
            booking.date = timezone.now()
            user_profile.entrys += 1
            user_profile.save()
            account.save()
            booking.save()
            return HttpResponseRedirect(reverse("finance:index"))
        else:
            context = {
                "title": "test",
                "create_booking_form": form
            }
            return render(request, self.template_name, context)

还有我的表格:

class CreateBookingForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(CreateBookingForm, self).__init__(*args, **kwargs)
        self.fields["account"].queryset =     Account.objects.filter(owner=self.user)

    class Meta:
        model = Entry
        exclude = ["expense", "date"]

在我尝试提交此表单并选择帐户类型之前,我工作正常。

【问题讨论】:

  • AddExpenseView 上的post 方法在哪里?
  • 对不起,我添加了post方法

标签: python django forms model


【解决方案1】:

在您的 post 方法中,您忘记将 user 传递给表单。由于您将account 字段的查询集设置为Account.objects.filter(owner=self.user),这意味着您在显示表单时和验证数据时有不同的查询集。

改成:

def post(self, request):
    form = self.form_class(request.POST, user=self.request.user)

最好把表格改成:

self.user = kwargs.pop('user')

那么当kwargs 中缺少user 时,您会得到一个显式错误。

【讨论】:

  • 这成功了,我现在感觉很愚蠢._。谢谢!
【解决方案2】:

在将account 模型实例直接传递给account 字段时,我在测试模型表单时也遇到了这种类型的错误。因为模型表单将外键字段显示为选择选项。 IE。它将所有帐户对象列为值为account.id 的选择选项,如果account_obj not in avilable choices(帐户ID 列表([int]))则抛出错误。

CreateBookingForm(data={'account': Account.objects.first()})

但在这里,我们必须传递帐户 id 而不是整个帐户对象。

CreateBookingForm(data={'account': Account.objects.first().id})

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 2021-08-04
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2021-04-12
    相关资源
    最近更新 更多