Django 排除表单字段,但使用clean()将其添加回
在django管理员中,我有一个内联代码,希望查看用户自动填写该代码。在Django 排除表单字段,但使用clean()将其添加回,django,django-admin,django-forms,Django,Django Admin,Django Forms,在django管理员中,我有一个内联代码,希望查看用户自动填写该代码。在clean功能期间,它用request.user填充created\u by字段。问题在于,由于表单排除了由创建的字段,因此插入到cleaned_字段中的值显然会被忽略。我该怎么做?我希望小部件根本不显示 class NoteInline(admin.TabularInline): model = Note extra = 1 can_delete = False def get_forms
clean
功能期间,它用request.user
填充created\u by
字段。问题在于,由于表单排除了由创建的字段,因此插入到cleaned_字段
中的值显然会被忽略。我该怎么做?我希望小部件根本不显示
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)
原始建议:
为什么不把这个领域留在原地,而不是把它排除在外,然后把它变成一个隐藏的输入
课堂笔记形式(forms.ModelForm):
建议#2(因为隐藏字段仍显示在内联的列标题中):
根本不要在clean()方法中设置self.cleaned_数据['created_by']。相反,重写NoteForm.save()并将其设置在那里
(如果可以的话,可以传入save()请求,也可以通过将其添加到self
将其缓存在init中,或者像您看起来已经做的那样将其用作类级变量。)我的解决方案是编辑内联的formfield\u 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)
在这种情况下,是时候进行重构了。参见上面编辑的示例
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)