在django管理员中,我有一个内联,我希望自动填写查看用户。在clean
功能期间,它会使用created_by
填充request.user
字段。问题是,由于表单排除了created_by
字段,因此插入cleaned_fields
的值显然会被忽略。我怎样才能做到这一点?我希望小部件根本不显示。
class NoteInline(admin.TabularInline):
model = Note
extra = 1
can_delete = False
def get_formset(self, request, obj=None, **kwargs):
"""
Generate a form with the viewing CSA filled in automatically
"""
class NoteForm(forms.ModelForm):
def clean(self):
self.cleaned_data['created_by'] = request.user
return self.cleaned_data
class Meta:
exclude = ('created_by', )
model = Note
widgets = {'note': forms.TextInput(attrs={'style': "width:80%"})}
return forms.models.inlineformset_factory(UserProfile, Note,
extra=self.extra,
form=NoteForm,
can_delete=self.can_delete)
答案 0 :(得分:2)
原始建议:
为什么不将场地留在原地,而不是将其排除,然后将其作为隐藏输入?
class NoteForm(forms.ModelForm):
def __init__(*args, **kwargs):
super(NoteForm, self).__init__(*args, **kwargs)
self.fields['created_by'].widget = forms.widgets.HiddenInput()
#rest of your form code follows, except you don't exclude 'created_by' any more
建议#2(因为隐藏字段仍显示在内联的列标题中):
根本不要在clean()方法中设置self.cleaned_data ['created_by']。相反,重写NoteForm.save()并将其设置在那里。
(如果可以,请传递save()请求,或者通过将其添加到self
将其缓存在init中,或者将其用作类似级别的变量,如您所见。 )
答案 1 :(得分:0)
我的解决方案是编辑Inline的formfield_for_foreignkey
函数,该函数将下拉列表限制为仅登录用户。
class NoteInline(admin.TabularInline):
model = Note
extra = 1
can_delete = False
def queryset(self, request):
return Note.objects.get_empty_query_set()
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'created_by':
# limit the 'created_by' dropdown box to just the CSR user who is
# logged in and viewing the page.
kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
return super(NoteInline, self).formfield_for_foreignkey(db_field, request, **kwargs)