2012-05-03 3 views
2

내가 멀티 블로그 응용 프로그램을 쓰고 있어요 말과 나는 각각의 저자가 자신의 기사에 대해 고유 한 제목을 사용하고자하는 (그러나 전 세계적으로 고유하지, 사용자 당 고유의) :는 암시 적으로 채워진 unique_together 및 현장 장고 관리자에

class Article(models.Model): 
    author = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=255) 
    #[...] 

    class Meta: 
     unique_together = (('title', 'owner'),) 

class ArticleAdmin(ModelAdmin): 

    exclude = ('owner',) 

    def save_model(self, request, obj, form, change): 
     if not change: 
      obj.owner = request.user 
     obj.save() 

을 사실이 작동하지 않습니다 : 나는, 장고 것 기존 저자 제목 조합으로 새로운 기사를 만들려고하면

는 지금, 나는 저자 필드가 자동으로 채워 응용 프로그램이되고 싶어 고유성을 검사하지 않습니다 (작성자가 양식에서 제외되었으므로). IntegrityError를 얻습니다. 그것이 데이터베이스를 친 때.

def clean(self): 
    if Article.objects.filter(title=self.title, owner=self.owner).exists(): 
     raise ValidationError(u"...") 

을하지만 Article.clean()가 전에 ArticleAdmin.save_model()를 호출, 그래서이 작동하지 않는 것 같다

나는 기사 클래스에 깨끗한 방법을 추가 생각했다. 이 질문의

Severalvariants

는 이미 여기에 요청을받은,하지만 솔루션 중 누구도 나를 위해 제대로 작동하지 :

  • 내가 Form.clean() 또는 다른 형태의 방법을 사용할 수 없습니다를하지 않아도 request.user가 필요하기 때문에 요청을 사용할 수 있습니다.
  • 동일한 이유로 모델 수준 유효성 검사를 수행 할 수 없습니다.
  • 일부 답변은 클래스 기반보기 또는 사용자 정의보기를 참조하지만 장고 관리자의 컨텍스트에서 계속하고 싶습니다.

내가 어떻게 관리 응용 프로그램의 절반을 다시 작성하지 않고 이것을 할 수있는 아이디어?

답변

0

당신은 실제로 ModelAdmin에 정의 된 양식에 request을 가져올 수있는 방법을 찾고있다 :

from django.core.exceptions import ValidationError 

def make_add_form(request, base_form): 
    class ArticleForm(base_form): 
     def clean(self): 
      if Article.objects.filter(title=self.cleaned_data['title'], owner=request.user).exists(): 
       raise ValidationError(u"...") 
      return self.cleaned_data 

     def save(self, commit=False): 
      self.instance.owner = request.user 
      return super(ArticleForm, self).save(commit=commit) 

    return ArticleForm 


class ArticleAdmin(admin.ModelAdmin): 
    exclude = ('owner',) 

    def get_form(self, request, obj=None, **kwargs): 
     if obj is None: # add 
      kwargs['form'] = make_add_form(request, self.form) 
     return super(ArticleAdmin, self).get_form(request, obj, **kwargs) 
관련 문제