2016-12-04 130 views
1

我想知道是否有任何的方式來進行(null=True)字段創建模型(或保存)時,需要一個可空?Django的僞造必填項

作爲一個超級用戶,我希望能夠留下某些領域與空,而其他工作人員將不能夠。

有沒有辦法做到這樣的事情?

在此先感謝。


編輯:

顯然,我做錯了什麼。

我有兩個StudentChangeFormStudentCreationForm這個確切__init__

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,似乎無法得到正確的。

很抱歉讓您煩惱。

回答

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 
+0

感謝您的快速反應。你能請編輯您的答案,這樣'required'將是TRUE;只有當'不user.is_superuser'?我只是想了解把它放在哪裏... – AnDrOiD

+0

@AnDrOiD我已經用例子更新了 –

+0

'someview'與視圖有什麼關係?我該怎麼處理它? – AnDrOiD