0

我有一个具有多项选择字段的 django 表单。该字段应该是动态的,即只应显示与当前登录的用户关联的记录。到目前为止,我已经设法把它放在一起;

表格.py

class myForm(forms.ModelForm):

    def __init__(self, someUser, *args, **kwargs):
        super(myForm, self).__init__(*args, **kwargs)

        someRecords = models.SomeModel.objects.filter(someUser = someUser)
        #The line above gets records associated with a specific user

        displayNames = []
        for i in someRecords:
            displayNames.append((i.someField, i.someOtherField + ' ' + i.someOtherField2))
            #I am basically making a list of tuples, containing a field and a concatnation of two other fields. The latter will be what is displayed in the select box

        self.fields['theSelectField'] = forms.ChoiceField(choices = displayNames)

        class Meta:
            #I defined model, fields and labels here

视图.py

def myFormPage(request):
    someUser = request.user.someextensionofuser.someUser
    form = forms.myForm(someUser)
    context = {'form': form}
    if request.method == 'POST':
        form = forms.myForm(someUser, data = request.POST)
        if form.is_valid():
            #Do Stuff if form is valid. However,this stuff doesn't get done, the page refreshes instead

所以我设法使选择选项动态化。但是,现在我无法提交数据。

编辑:其中一条评论帮助我解决了前面提到的问题。我已经更新了 views.py 代码。但是,现在我遇到了这个错误;

无法分配“'someString'”:“someModel.someField”必须是“someForeignModel”实例

选项值似乎是字符串而不是对对象的引用。我该如何解决这个问题?

4

2 回答 2

0

这限制了您的选择字段的可能选项:

self.fields['theSelectField'].queryset = SomeModel.objects.filter(someUser = someUser)

在您的视图中,您可能希望使用基于类的视图,因为它会自动处理大量内容并节省您的时间。看看这里:https ://ccbv.co.uk/

于 2020-08-03T20:09:51.760 回答
0

我想通了。由于我的主要问题是如何向用户显示选项,因此我决定将models.py 中的str方法更改为;

class someModel(models.Model):
    #my fields

    def __str__(self):
        return self.someField + ' ' + self.someOtherField

然后在我的 forms.py 中,我选择了@dmoe 的回答;

self.fields['theSelectField'] = forms.ModelChoiceField(queryset = models.SomeModel.objects.filter(someUser = someUser))

所以现在这两个问题都解决了。我的选项有自定义标签,我可以提交我的数据而不会遇到 valueError。

于 2020-08-04T05:30:21.450 回答