2014-05-21 4 views
5

어느 옵션이 최상입니까 1 또는 2입니까?기본 모델 필드를 양식 또는 모델로 설정해야합니까?

class TopicForm(forms.Form): 

    name = forms.CharField(required=True) 
    body = RichTextFormField(required=True) 

    def save(self, request): 
     t = models.Topic(user=request.user, 
         site=get_current_site(request), 
         name=self.cleaned_data['name'], 
         body=self.cleaned_data['body']) 
     t.slug = slugify(self.name) 
     t.body_html = seo.nofollow(seo.noindex(self.body)) 
     t.ip = utils.get_client_ip(request) 
     t.save() 

또는 2에 따라 다르다

class Topic(models.Model): 
    ... 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     self.body_html = seo.nofollow(seo.noindex(self.body)) 
     self.ip = utils.get_client_ip(request) 
     super(Topic, self).save(*args, **kwargs) 
+0

는 아마도 더 많은 지식을 가진 사람이 질문을 반영하기 위해이 질문에 제목을 편집 할 수 . 그것은 조금 모호하며 질문을 반영하는 것처럼 보입니다. – Deepend

+0

주제 이름을 업데이트합니다. – user1624522

답변

0

1.

. 이것이 모든 모델에 적용되어야한다면 모델에서 더 좋습니다. 모든 Topic 개체는 관리 인터페이스에서 편집 된 개체라도 올바른 값을 갖습니다.

양식은 사용자의 데이터를 확인하는 용도로만 사용해야하며 모델은 이러한 종류의 작업을 자동화하는 데 적합합니다 (개체를 저장하기 전에 데이터 생성). 주의해서, 예외를 발생 시키거나 데이터를 무효로해서는 안됩니다.

0

개인적으로 나는 두 번째 옵션을 선호합니다. 모델은 비즈니스 논리도 정의해야하며 양식은 사용자 I/O 만 처리해야합니다. 이렇게하면 프로그램 방식 (다른 코드에서 가져 오거나 호출)으로 사용하더라도 응용 프로그램의 일관성이 유지됩니다.

4

차이점은 첫 번째 버전은 양식을 통해 개체를 수정할 때만 적용되는 반면 두 번째 모델은 모델이 저장 될 때마다 적용된다는 점입니다 (여전히 데이터베이스 행을 수정할 수있는 모든 방법의 하위 집합 임). 장고). 현재 양식을 통해서만 객체를 만들지 만, 여전히 염두에 두어야 할 유용한 구분이라고 생각합니다.

귀하의 경우 두 가지가 혼합되어있는 것처럼 보입니다. slug은 항상 name을 기반으로 설정하려는 것입니다. 즉, 모델 자체에 고유합니다. 반면에 client_ip이라는 아이디어는 웹 요청을 통해 양식이있는 객체를 만드는 개념에 절망적으로 묶여있는 것처럼 보입니다.

물론이 모델의 세부 사항을 알면 더 좋은 위치에 있지만, 그 질문에 접근하는 일반적인 방법입니다. 당신은 그것의 더 나은 같은 신호를 사용하는 2를 사용 야해

0

미리 저장하거나

소스 후 저장 : https://docs.djangoproject.com/en/dev/topics/signals/

@receiver(pre_save, sender=Topic) 
    def topic_pre_save_handler(sender, instance, **kwargs): 
     instance.slug = slugify(self.name) 
     instance.body_html = seo.nofollow(seo.noindex(self.body)) 
     instance.ip = utils.get_client_ip(request) 
관련 문제