2013-07-26 20 views
7

Tôi đang thực hành với FormViews của Django.Django CreateView cung cấp cho một lỗi "cần phải có một giá trị cho trường" ... "trước khi mối quan hệ nhiều-nhiều này có thể được sử dụng."

Trong ứng dụng này, tôi đang tạo chế độ xem PostCreate tạo bài đăng trên blog.

Dưới đây là mã của tôi:

models.py

class Post(models.Model): 
    user = models.ForeignKey(User) 
    post_title = models.CharField(max_length=200) 
    post_content = models.CharField(max_length=500) 

class Tag(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    posts = models.ManyToManyField(Post) 

forms.py

class PostForm(forms.ModelForm): 
    post_title = forms.CharField(
     label=u'Title', 
     widget=forms.TextInput(attrs={'size':64}) 
    ) 
    post_content = forms.CharField(
     label=u'Content', 
     widget=forms.TextInput(attrs={'size':128}) 
    ) 
    tags = forms.CharField(
     label=u'Tags', 
     required=True, 
     widget=forms.TextInput(attrs={'size':64}) 
    ) 
    class Meta: 
     model = Post 
     exclude = ('user', 'post_date') 

views.py

class PostCreate(CreateView): 
    template_name = 'app_blog/post_save_form.html' 
    model = Post 
    form_class = PostForm 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.user = self.request.user 

     tag_names = form.cleaned_data['tags'].split() 
     for tag_name in tag_names: 
      tag, dummy = Tag.objects.get_or_create(name=tag_name) 
      self.object.tag_set.add(tag) 

     return super(PostCreate, self).form_valid(form) 

Khi tôi cố gắng tiết kiệm một bài (Test Post 1) vào một cơ sở dữ liệu, nó mang lại cho tôi một lỗi:

nhu cầu phải có một giá trị cho trường "bài" trước khi điều này nhiều-nhiều mối quan hệ có thể đã sử dụng.

Có vẻ như vấn đề là do các dòng trong views.py nơi tôi chia trường "thẻ" và thêm các thẻ vào trường tag_set của đối tượng bài đăng. Tôi cho rằng logic này không nên được bao gồm trong phương pháp form_valid ... nhưng tôi không biết nơi nào khác này nên được thực hiện ..

Bất kỳ trợ giúp sẽ được đánh giá cao :) Cảm ơn rất nhiều

Trả lời

9

Không, đó không phải là vấn đề là gì. Vấn đề là bạn chưa lưu đối tượng Post, vì vậy bạn không thể tạo mối quan hệ nhiều-với-nhiều với nó (vì dưới mui xe, m2m chỉ là một bảng liên kết với các khóa ngoài cho cả hai thực thể). Giải pháp là để tiết kiệm self.object trước tiên.

+0

đề nghị bạn giải quyết các lỗi !! Tuy nhiên, sau khi thực hiện việc đó, đối tượng Thẻ được thêm vào cho mỗi bài đăng vì một số lý do .... Ví dụ: nếu tôi thêm Tag1 vào Bài đăng # 4, Tag1 sẽ được thêm vào Bài đăng # 1, Bài đăng # 2, Bài đăng # 3 và Đăng # 4 .. Idk lý do tại sao điều này xảy ra ... :( – user2492270

+0

Vâng, gợi ý thực sự hữu ích. Bằng cách này, đôi khi tôi nghĩ rằng thông báo lỗi tốt là màu xanh lá cây. Các thông báo lỗi (khó hiểu) (như thế này) cần phải suy nghĩ google để hỏi (và cũng có thể được trả lời) Có lẽ thậm chí tệ hơn, nếu người hỏi không biết để chấp nhận một câu trả lời đúng ;-) – stanleyxu2005

+0

Cảm ơn bạn đã tiết kiệm cho tôi giờ. .... –

7

Bạn nên lưu đối tượng của bạn sau khi gán người dùng và sau đó làm việc với các mối quan hệ m2m:

self.object = form.save(commit=False) # Not saved to database. 
self.object.user = self.request.user 
self.object.save() # Saved. 

tag_names = form.cleaned_data['tags'].split() 
for tag_name in tag_names: 
    tag, dummy = Tag.objects.get_or_create(name=tag_name) 
    self.object.tag_set.add(tag) 
Các vấn đề liên quan