2016-12-04 1 views
1

모델을 만들 때 (또는 저장시) nullable (null=True) 필드가 필요하도록 만들 수있는 방법이 있는지 알고 싶습니다.Django Fake Required Fields

수퍼 유저로서 다른 직원이 할 수없는 동안 특정 필드를 null로 남겨 둘 수 있기를 바랍니다.

그런 식으로 할 수있는 방법이 있습니까?

미리 감사드립니다.


편집 :

분명히 내가 뭔가 잘못하고 있어요.

내가 모두 StudentChangeFormStudentCreationForm이 정확한 __init__이 있습니다

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? 

내가 이미 시도 많은 변화 :

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 

나는 또한 내 관리자의 Student 모델을 나타내는 StudentAdmin 클래스가 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

빠른 응답을 주셔서 감사합니다. 'not user.is_superuser'만이'required'가'True'가되도록 답을 편집 해 주시겠습니까?나는 그것을 어디에 넣어야 하는지를 이해하려고 노력 중입니다 ... – AnDrOiD

+0

@AnDrOiD 예제가 업데이트되었습니다 –

+0

보기'someview'는 어떻게 관련이 있습니까? 어떻게해야합니까? – AnDrOiD

관련 문제