2012-04-27 17 views
5

tôi có 2 mô hình đa bảng kế thừa như thế này:hình thức Django: cách DRY nhất để tổ chức tạo các biểu mẫu/cập nhật cho các mô hình thừa hưởng

class Post(models.Model): 
    title = models.CharField(max_length=100, blank=True, null=True) 
    text = models.TextField(blank=True, null=True) 
    location = models.PointField() 
    ... 

class BlogPost(Post): 
    blog = models.ForeignKey(Blog) 

Tương tự như vậy, hình thức lớp học cho bài đăng trên blog cũng được thừa hưởng từ lớp PostForm:

class PostForm(MapModelForm): 
    ... 
    class Meta: 
     model = Post 

    def clean(self): 
     ... 

class BlogPostForm(PostForm): 
    class Meta: 
     model = BlogPost 

Tôi đã sử dụng để xử lý tạo/cập nhật cho cả hai kiểu máy ở 2 chế độ xem không dựa trên lớp. Để thực hiện những điều DRY, tôi đã quyết định cung cấp cho các chế độ xem chung dựa trên lớp của Django. Nhưng do thiếu các ví dụ và sự không thân thiện với người dùng của các tài liệu liên quan và nhiều cách tiếp cận, tôi bối rối.

Ý tưởng là có chế độ xem biểu mẫu dựa trên lớp học cho mô hình Post và kế thừa chúng cho BlogPost. Tôi nên điều chỉnh các lớp xem như thế nào?

Tôi có nên có chế độ xem PostCreate và PostUpdate riêng biệt không? Sau đó, hai lớp học gần như giống hệt nhau và không phải là DRY cả.

Tôi có nên có một đơn FormView để cập nhật/tạo bài đăng không? Nó hoạt động để tạo ra nhưng tôi không thể tìm ra cách để làm điều này để cập nhật.

Tôi có nên tạo chế độ xem tùy chỉnh (hoặc hai chế độ xem để tạo/cập nhật) bằng cách sử dụng các lớp mixin được cung cấp thay vì kế thừa trực tiếp từ chế độ xem không?

Trả lời

8

Bạn nói đúng rằng tài liệu chế độ xem dựa trên lớp học khá nguyên thủy. Không nghi ngờ gì nó sẽ cải thiện, nhưng trong thời điểm này, bạn cần chuẩn bị để thử nghiệm và read the source.

Bạn đang cố gắng để làm hai việc:

  1. Tìm một cách tốt để tổ chức các quan điểm của bạn sử dụng các lớp học.
  2. Tái cấu trúc mã của bạn để tránh lặp lại.

Điều quan trọng là phải giải quyết vấn đề này cùng một lúc. Tìm ra hệ thống phân cấp lớp phù hợp trước tiên và chỉ rồi tìm ra cách để tính toán sự lặp lại.

Hãy bắt đầu. hệ thống cấp bậc lớp học của bạn sẽ trông giống như thế này:

from django.views import generic 

class PostCreateView(generic.CreateView): 
    form_class = PostForm 
    model = Post 

class PostUpdateView(generic.UpdateView): 
    form_class = PostForm 
    model = Post 

class BlogPostCreateView(generic.CreateView): 
    form_class = BlogPostForm 
    model = BlogPost 

class BlogPostUpdateView(generic.UpdateView): 
    form_class = BlogPostForm 
    model = BlogPost 

này liên quan đến nhiều sự lặp lại, nhưng nó rõ ràng bây giờ làm thế nào để yếu tố ra một số của nó:

from django.views import generic 

class PostView(generic.FormView): 
    form_class = PostForm 
    model = Post 

class PostCreateView(PostView, generic.CreateView): pass 
class PostUpdateView(PostView, generic.UpdateView): pass 

class BlogPostView(PostView): 
    form_class = BlogPostForm 
    model = BlogPost 

class BlogPostCreateView(BlogPostView, generic.CreateView): pass 
class BlogPostUpdateView(BlogPostView, generic.UpdateView): pass 

Và nếu bạn vẫn không hài lòng với số lượng lặp lại ở đây, bạn có thể tự động hóa thêm việc xây dựng các lớp này (sử dụng type để tạo các lớp khi chạy). Đó có thể là một bước quá xa, mặc dù, cho đến khi bạn hoàn toàn thoải mái với việc sử dụng các khung nhìn dựa trên lớp học.

+0

cảm ơn câu trả lời xuất sắc. – omat

+0

Cách định tuyến đến chế độ xem tốt khi bạn không biết liệu POST sẽ tạo hoặc cập nhật? Có cách nào tốt để làm điều đó theo cấu trúc này? – lajarre

Các vấn đề liên quan