2014-05-21 14 views
5

Tùy chọn nào là tốt nhất, 1 hoặc 2?Các trường mô hình mặc định có được đặt bởi Biểu mẫu hoặc Mẫu không?

1.

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() 

hoặc 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

Có lẽ ai đó có kiến ​​thức nhiều hơn nữa có thể chỉnh sửa tiêu đề câu hỏi này để phản ánh các câu hỏi . Đó là một chút mơ hồ và dường như để phản ánh câu hỏi. – Deepend

+0

i cập nhật tên chủ đề – user1624522

Trả lời

0

Nó phụ thuộc. Nếu điều này nên được áp dụng cho mọi mô hình, thì nó tốt hơn trong mô hình. Nó sẽ đảm bảo với bạn rằng mọi đối tượng Topic sẽ có giá trị chính xác, ngay cả những giá trị bạn được chỉnh sửa từ giao diện quản trị.

Biểu mẫu chỉ nên sử dụng để kiểm tra dữ liệu từ người dùng và mô hình thích hợp để tự động hóa loại tác vụ này (tạo dữ liệu trước khi lưu đối tượng). Hãy cẩn thận, tuy nhiên, điều này sẽ không làm tăng ngoại lệ hoặc làm mất hiệu lực dữ liệu.

0

Cá nhân tôi thích tùy chọn thứ hai. Mô hình cũng nên xác định logic nghiệp vụ, trong khi các biểu mẫu chỉ cần xử lý I/O của người dùng. Bằng cách này, ứng dụng của bạn sẽ duy trì sự nhất quán ngay cả khi được sử dụng theo cách có lập trình (được nhập và gọi từ mã khác).

4

Sự khác biệt là phiên bản đầu tiên chỉ được áp dụng khi sửa đổi đối tượng thông qua biểu mẫu, trong khi phiên bản thứ hai được áp dụng bất cứ khi nào mô hình được lưu (mặc dù đó vẫn là tập con của tất cả các cách có thể sửa đổi hàng cơ sở dữ liệu Django). Ngay cả khi bạn hiện chỉ tạo ra các đối tượng thông qua các hình thức, tôi nghĩ rằng nó vẫn là một sự khác biệt hữu ích để ghi nhớ.

Dường như với tôi như một hỗn hợp của cả hai có ý nghĩa trong trường hợp của bạn. A slug là thứ mà bạn sẽ luôn muốn đặt dựa trên name - tức là, nó vốn có của chính mô hình đó. Mặt khác, ý tưởng về một client_ip dường như không thể tránh khỏi gắn với khái niệm tạo một đối tượng có biểu mẫu thông qua một yêu cầu web.

Tất nhiên, bạn đang ở vị trí tốt hơn để biết về chi tiết cụ thể của mô hình này, nhưng đó là cách chung tôi sẽ tiếp cận câu hỏi.

0

Bạn không nên sử dụng 2. nó tốt hơn để sử dụng một tín hiệu như trước lưu hoặc sau lưu

Nguồn: 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) 
Các vấn đề liên quan