ModelForm忽略了MultiChoice字段的Django初始值

ModelForm忽略了MultiChoice字段的Django初始值,django,foreign-keys,modelform,multichoiceitems,Django,Foreign Keys,Modelform,Multichoiceitems,这是我在这里的第一篇文章,我对Django很陌生,但我似乎找不到解决这个问题的方法。。。我搜索了stackoverflow和google,但似乎没有任何东西适合我 我有一个葡萄酒应用程序,希望能够添加和删除用户的库存葡萄酒。在葡萄酒列表中,用户可以选择要添加的葡萄酒,并在POST数据中传递该葡萄酒的ID。由于第一次呈现视图后数据丢失,我将ID保存在cookie中,这是可行的,但问题是当我使用ModelForm de user时,必须为用户和wine选择外键,这很糟糕,因此,我尝试将其隐藏,并在用

这是我在这里的第一篇文章,我对Django很陌生,但我似乎找不到解决这个问题的方法。。。我搜索了stackoverflow和google,但似乎没有任何东西适合我

我有一个葡萄酒应用程序,希望能够添加和删除用户的库存葡萄酒。在葡萄酒列表中,用户可以选择要添加的葡萄酒,并在POST数据中传递该葡萄酒的ID。由于第一次呈现视图后数据丢失,我将ID保存在cookie中,这是可行的,但问题是当我使用ModelForm de user时,必须为用户和wine选择外键,这很糟糕,因此,我尝试将其隐藏,并在用户选择要添加的瓶数后但在验证之前设置Fk_用户和Fk_葡萄酒。google everyone建议我使用“首字母”并将其传递到表单后,出现了一个问题,但这显然不起作用,因为如果我使表单中的字段可见,我可以看到它没有被预选

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']

有人能帮我吗?

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

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

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\u auth\u user
。只需将其称为
user

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

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

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\u auth\u user
。只需将其称为
user

谢谢您的最后一句话。有时初学者没有意识到命名约定在代码可读性和可维护性方面有多么重要。谢谢你的最后一句话。有时初学者没有意识到命名约定在代码可读性和可维护性方面有多么重要。