我想知道在创建模型(或保存)时是否需要设置可为空(null=True
)的字段?
作为超级用户,我希望能够将某些字段留空,而其他工作人员则无法使用。
有没有办法做那样的事情?
提前致谢。
修改
显然,我做错了什么。
我对__init__
和StudentChangeForm
都准确StudentCreationForm
:
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(StudentCreationForm, self).__init__(*args, **kwargs) # StudentChangeForm in StudentChangeForm (obviously)
if self.user.is_superuser:
self.fields['picture'].required = False
我还有一个StudentAdmin
类,代表我的管理员中的Student
模型:
class StudentAdmin(UserAdmin):
form = StudentChangeForm
add_form = StudentCreationForm
...
class Meta:
model = Student
def get_form(self, request, obj=None, **kwargs):
kwargs.update({'user': request.user})
# What's supposed to be here?
我在get_form
中尝试了很多变体,但似乎无法找到合适的变体。
很抱歉打扰你。
答案 0 :(得分:2)
你当然可以做到这一点,当有与用户有关的信息时,它会派上用场,在你需要创建对象时你不会知道自己。
因此,为此,您只需创建自己的表单并根据需要在表单中声明字段。然后,您可以在创建对象之前在表单上运行验证。
例如,这是我获得的模型管理员使用的表单;
class EventAdminForm(forms.ModelForm):
category = forms.ModelChoiceField(
label=_("State/Province/Territory"),
queryset=Category.objects.none(),
empty_label=_("---------"),
required=False,
)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(EventAdminForm, self).__init__(*args, **kwargs)
if not self.user.is_superuser:
self.fields['category'].required = True
class Meta:
model = Event
exclude = ()
与任何其他表单一样,您可以定义字段,以及是否需要它们。
因此,在更新之后,您需要将用户传递给表单。例如;
def someview(request):
if request.method == 'POST':
form = EventAdminForm(request.POST, user=request.user)
if form.is_valid():
# Do something with the data
pass
else:
form = EventAdminForm(user=request.user)
如果您有表单,但想知道您是否正在编辑某个对象,或者想要创建一个表单,那么它非常简单。如果您正在进行编辑,则表单将包含一个实例属性,该属性是您正在编辑的对象。
get_from()
会收到一个obj
参数,如果您正在编辑该参数,则可能是该对象,但您必须检查该参数。文件在这里; https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_form
修改强>
好的,让我们简化一下,并将所需的逻辑放入管理员,然后根本不需要弄乱表单;
def get_form(self, request, obj=None, **kwargs):
form = super(StudentAdmin, self).get_form(request, obj, **kwargs)
if request.user.is_superuser:
form.base_fields['picture'].required = False
return form