【问题标题】:Django- Dependent Dropdown Form results in "invalid choice" on POSTDjango-依赖下拉表单在 POST 上导致“无效选择”
【发布时间】:2019-07-31 16:04:28
【问题描述】:

我正在使用本教程:https://simpleisbetterthancomplex.com/tutorial/2018/01/29/how-to-implement-dependent-or-chained-dropdown-list-with-django.html

向我的表单添加依赖下拉列表,但是当我发布数据时,它返回表单无效并出现无效选择错误。

在我的表单的 init 覆盖中,如果我消除下拉查询集,那么它就可以工作,但这违背了目的。

我的看法:

def add_have(request, id=None):
    if request.method == "POST":
        print("User: {}".format(request.user))
        for key, value in request.POST.items():
            print('{}: {}'.format(key, value) )
        form = HaveForm(request.POST)
        if form.is_valid():
            model_instance = form.save(commit=False)
            model_instance.profile = request.user
            model_instance.save()
        else:
            print(form.errors)
            print("FORM IS INVALID")
        return redirect('display_have_list')
    else:
        form = HaveForm()
        return render(request, 'add_have.html', {'form': form})

我的表格:

class HaveForm(forms.ModelForm):
    class Meta:
        model = Have
        fields = ['category', 'item']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['category'].queryset=Category.objects.all()
        self.fields['item'].queryset = Items.objects.none()

我的模特:

class Category(models.Model):
    name = models.CharField(max_length=200)

class Items(models.Model):
    name = models.CharField(max_length=200)
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
    description = models.TextField(max_length=1000)

class Have(models.Model):
    profile = models.ForeignKey('users.Profile', on_delete=models.SET_NULL, null=True)
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
    item = models.ForeignKey('Items', on_delete=models.SET_NULL, null=True)

我收到的错误消息暗示它没有加载项目:

web_1  | User: <my_username>
web_1  | csrfmiddlewaretoken: <my_token>
web_1  | category: 1
web_1  | item: 4496
web_1  | <ul class="errorlist"><li>item<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul>
web_1  | FORM IS INVALID
web_1  | [31/Jul/2019 09:01:24] "POST /trade/add_have/ HTTP/1.1" 302 0
web_1  | [31/Jul/2019 09:01:24] "GET /trade/display_have_list/ HTTP/1.1" 200 2638
web_1  | [31/Jul/2019 09:01:24] "GET /static/css/styles.css HTTP/1.1" 404 1767

如果我从初始化中限制项目查询集,那么它保存得很好。我知道问题出在我初始化表单的方式上,但我不确定如何解决。

【问题讨论】:

    标签: django


    【解决方案1】:

    分享您的模型可能有助于找到答案。我的猜测是 模型中的字段项不允许空值。 当您执行 self.fields['item'].queryset = Items.objects.none() 然后使用表单时,Items 的值为 null 并且表单将无效。

    您可以更改该字段以允许为 null,然后您可以继续逐步实施示例。

    另外,假设 category 是外键,self.fields['category'].queryset=Category.objects.all() 不是必需的。

    【讨论】:

    • 感谢您的意见。模型相当简单,但如果 self.fields['item'].queryset = Items.objects.none() 行将项目设置为空,那么这只会加强我最初的想法,即它在做什么。真正的问题是如何让下拉菜单在表单的非发布请求上起作用,即查询集为空,但提交实际选定的项目以用于 POST 函数,这将具有所需的行为....
    • 啊,看看你的模型(并重新查看他的逐步说明)我知道你在哪里。您的帖子如何发布 item=4496 Item 应该为 Null。 (因为您清除了所有选项。)我会检查您正在使用的模板中发生了什么,看看那里是否发生了什么。
    猜你喜欢
    • 2021-02-14
    • 2021-08-25
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    相关资源
    最近更新 更多