【问题标题】:Django initial value for MultiChoice Field ignored for ModelFormModelForm 忽略 MultiChoice 字段的 Django 初始值
【发布时间】:2018-05-21 08:24:31
【问题描述】:

这是我在这里的第一篇文章,我对 Django 很陌生,但我似乎无法找到解决这个问题的方法……我搜索了 stackoverflow 和谷歌,但似乎没有什么对我有用……

我有一个葡萄酒应用程序,希望能够从用户的库存中添加和删除葡萄酒。在酒的列表中,用户可以选择要添加的酒,该酒的 ID 在 POST 数据中传递。由于在第一次呈现视图后数据丢失了,我将 ID 保存在 cookie 中,这是有效的,但问题是当我使用 ModelForm 时,用户必须为用户和酒选择外键,这很糟糕,所以我尝试在用户选择要添加的瓶子数量但在验证之前将其隐藏并设置 Fk_user 和 Fk_wine。这是谷歌每个人都建议我应该使用“初始”并将其传递给表单之后的问题,但这显然不起作用,因为如果我使表单中的字段可见,我可以看到它没有被预先选择......

viewy.py:

def addStockView(request):
    wineId = request.POST.get('addStock')
    if 'addStock' in request.POST:
        wine = get_object_or_404(Wine, idwine=int(wineId))
    userId = request.user.id
    user = get_object_or_404(AuthUser, id=userId)
    if request.method == 'POST':
        #wineIdNew = request.COOKIES.get('wineIdToAdd')
        #wineNew = get_object_or_404(Wine, idwine=wineIdNew)
        form = StockForm(request.POST, initial={'fk_wine': wineNew.idwine, 'fk_auth_user': user.id})
        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = StockForm(initial={'fk_wine': wine.id,
                                  'fk_auth_user': user.id})
    response = render(request, 'addToStock.html', {'form': form})
    response.set_cookie('wineIdToAdd', wineId)
    return response

forms.py:

class StockForm(forms.ModelForm):
    #fk_wine = ModelChoiceField(queryset=Wine.objects.all(),
      #                        widget=HiddenInput())
    #fk_auth_user = ModelChoiceField(queryset=AuthUser.objects.all(),
     #                          widget=HiddenInput())
    class Meta:
        model = UserWineStock
        fields = ['fk_auth_user', 'fk_wine', 'number']

谁能帮我解决这个问题..?

【问题讨论】:

    标签: django foreign-keys modelform multichoiceitems


    【解决方案1】:

    是的,当表单绑定到提交的数据时,初始数据会被忽略。

    您应该从表单中排除这两个字段并将它们设置在创建的对象上,而不是在此处使用初始值:

    form = StockForm(request.POST)
    if form.is_valid():
        item = form.save(commit=False)
        item.fk_wine = wine
        item.fk_auth_user = request.user
        item.save()
        return redirect('home')
    

    (另外,请不要将您的字段称为fk_auth_user。只需将其称为user。)

    【讨论】:

    • 谢谢你的最后一句话。有时初学者没有意识到命名约定对于代码的可读性和可维护性有多么重要。
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2019-08-11
    • 2018-01-11
    • 2018-08-21
    • 2018-11-19
    • 1970-01-01
    • 2015-04-15
    • 2018-05-15
    相关资源
    最近更新 更多