【发布时间】:2015-10-09 15:55:06
【问题描述】:
关于将request.user 传递给ModelForm 中的queryset,我想向社区提出以下问题。我的ModelForm 是:
class goForm(ModelForm):
user_choice = goModelChoiceField(
widget=forms.RadioSelect,
queryset=Document.objects.all().filter(who_upload=request.user),
empty_label=None,
to_field_name='docfile',
label = 'Please select'
)
class Meta:
model = go
fields = ['user_choice']
与
class goModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "'%s' uploaded on %s" % (obj.file_name,
obj.when_upload.date())
我找到的所有答案都是指将request.user 传递给__init__ 或使用过滤后的选择填充视图中的goForm。但是,在我的情况下似乎没有任何效果,因为我已经对表单进行了子类化以返回特定的字符串,而且我正在使用
RadioSelect 小部件特别需要 queryset 作为参数(我对此不是 100% 确定)。那么如何在user_choice 中传递request.user 呢?
【问题讨论】:
-
在
__init__中执行此操作是完全正确的解决方案,您拥有自定义类这一事实无关紧要。请展示您尝试过的内容以及遇到的错误。 -
请检查您的代码的缩进。将
goModelChoiceField放在 ModelForm 中可能是个坏主意(它会使代码混乱并阻止您在其他类中重用它)。在goModelChoiceField中定义user_choice肯定是错误的。 -
@Alasdair :是的,我意识到,我将
user_choice移到goModelChoiceForm之外和Meta类中。奇怪的是它是如何以两种方式工作的。谢谢。 -
user_choice字段也不应该在 Meta 类中定义。 -
不,如果它在 Meta 中,它根本不起作用:Django 不希望在那里定义字段。你应该将 goModelChoiceField 变成一个独立的类;嵌套类在 Python 中没有任何好处。这些事情都不会影响你如何通过
request.user,这仍然需要在__init__中完成。
标签: django django-forms django-views django-queryset modelform