2010-03-05 3 views
2

주어진 날짜가 미래인지 확인하려면 관리자의 내 DateField에 추가 유효성 검사를 추가해야합니다. 나는 그런 일에 경험이 없으므로 여기에 내가 한 일이있다. 1) 나는 사용자 지정 양식 필드를 생성 및 검증을 추가했습니다 :기본 관리자 모델 양식 django를 재정의 할 수 없습니다

class PastDateField(forms.DateField): 
    def clean(self, value): 
    """Validates if only date is in the past 
    """ 
     if not value: 
      raise forms.ValidationError('Plase enter the date') 
     if value > datetime.now(): 
      raise forms.ValidationError('The date should be in the past, not in future') 
     return value 

2) 다음에 내가 추가 한 사용자 정의 모델 형태 :

class CustomNewsItemAdminForm(forms.ModelForm): 
    title = forms.CharField(max_length=100) 
    body = forms.CharField(widget=forms.Textarea) 
    date = PastDateField() 
    region = forms.ModelChoiceField(Region.objects) 

3) 그리고 여기에 내가 등록한 방법 관리자 :

class NewsItemAdmin(admin.ModelAdmin): 
    form = CustomNewsItemAdminForm 

    def queryset(self, request): 
     return NewsItem.objects.all() 

admin.site.register(NewsItem, NewsItemAdmin) 

이의 결과는 내 관리 양식 1) 나는 사용자 지정 관리 형태로 지정하지 않은 필드 2) JavaScr 결여를 표시한다는 것입니다 ipt calendar at datetime 필드

내가 뭔가 잘못하고있는 것이 꽤 분명하지만, 나는 멍청이로서 나의 필요와 관련된 예제를 찾지 못했습니다. 일을 망치지 않고 datetime 필드에 사용자 정의 유효성 검사를 추가하는 더 좋은 방법은 무엇입니까?

EDIT : 정답은 Brian Luft와 Daniel Roseman에게 감사드립니다. 여기에 같은 문제에 직면 사람이 포스트가 도움이 있도록하려면 결과 코드 : - 또는 관리자 중 여부 - ModelForm에 명시 적으로 필드를 선언, 첫째

class CustomNewsItemAdminForm(forms.ModelForm): 
    class Meta: 
     model = NewsItem 

    def clean_date(self): 
     """Validates if only date is in the past 
     """ 
     date = self.cleaned_data["date"] 
     if date is None: 
      raise forms.ValidationError('Plase enter the date') 
     if date > datetime.now().date(): 
      raise forms.ValidationError('The date should be in the past, not in future') 
     return self.cleaned_data["date"] 

class NewsItemAdmin(admin.ModelAdmin): 
    form = CustomNewsItemAdminForm 

    def queryset(self, request): 
     return NewsItem.objects.all() 

admin.site.register(NewsItem, NewsItemAdmin) 
+1

메타 모델 선언을 양식에 추가 했습니까 (일부만 남겨 뒀습니까?). 폼의 필드를 선언 할 필요는 없으며 대신 '필드'또는 '제외'옵션을 사용해야합니다. 마지막으로 date를 일반 DateField로 남겨두고 양식 자체에 clean_date 메소드를 제공 할 수 있습니다. http://docs.djangoproject.com/ko/1.1/ref/contrib/admin/#adding-custom-validation-to -the-admin http://docs.djangoproject.com/ko/1.1/topics/forms/modelforms/#overriding-modelform-clean-method 모델 정의에 붙여 넣을 수 있습니까? –

답변

2

의미하지 않는 다른 필드는하지 않습니다 표시됩니다. 양식 클래스에 fields 또는 exclude 튜플을 정의해야합니다. 다른 필드가 모두 기본값 인 경우 재정의하려는 필드를 간단히 선언 할 수 있습니다.

둘째, 맞춤 필드에서 자바 스크립트를 사용하려면 오른쪽 위젯 django.contrib.admin.widgets.AdminDateWidget을 사용해야합니다. 그러나 사용자 정의 필드를 전혀 정의하지 않고 양식 자체에 clean_date 메소드를 정의하는 훨씬 쉬운 방법이 있습니다.

관련 문제