2017-04-25 18 views
0

我有這樣的URL映射:的Django的DetailView與形式徵求意見

url(r'^article/(?P<slug>[-\w]+)/$', views.ArticleView.as_view(), name='article-detail'), 

,我有這樣的觀點:

class ArticleView(DetailView): 
    model = Article 
    template_name = 'template/article.html' 
    context_object_name = 'article' 

    def get_context_data(self, **kwargs): 
     context = super(ArticleView, self).get_context_data(**kwargs) 
     context['comments'] = self.object.comment_set.filter(approved=True) 
     return context 

我已經顯示所有已批准的意見(正如你看到的),但我不知道如何在該文章視圖中創建評論表單。 我有這個ModelForm

class CommentForm(forms.ModelForm): 
    class Meta: 
     model = Comment 
     fields = '__all__' 

和... Comment模型:

class Comment(models.Model): 
    author = models.CharField(max_length=100) 
    article = models.ForeignKey(Article, on_delete=models.CASCADE) 
    email = models.EmailField() 
    message = models.TextField(max_length=1000) 
    created_at = models.DateTimeField(auto_now_add=True) 
    approved = models.BooleanField(default=False) 

與CommentForm的問題是,我不知道如何「隱藏」的文章和認可領域以及如何用ArticleView中獲得的文章填充文章字段。

我試過將FormMixinDetailView結合,但是..當我提交 評論表時,控制檯顯示:Method not Allowed (POST)。 如何創建到ArticleView的表單視圖?

如果你沒有得到什麼,請問我,我知道我的語法不好。我會盡量保持清晰。

在此先感謝您的答案。

+1

https://docs.djangoproject.com/en/1.11/topics/class-based-views/mixins/#using-formmixin-with-detailview – Wilfried

+0

好吧,其實我做了一件事,但我有... ...問題。 https://i.gyazo.com/8dc8acca8743b9735da2f06628ed6583.png我有那篇文章字段,並承認不應該由用戶訪問。 (見圖) – ShadowXsc

+0

我可以排除'被接納'(實際上'已批准',但我忘記更改名稱),但我不知道如何隱藏和設置文章字段的值以便屬於該特定文章。 – ShadowXsc

回答

0

我解決了它,那種..

class ArticleView(FormMixin, DetailView): 
    model = Article 
    template_name = 'template/article.html' 
    form_class = CommentForm 

    def get_success_url(self): 
     return reverse('article-detail', kwargs={'slug': self.object.slug}) 

    def get_context_data(self, **kwargs): 
     context = super(ArticleView, self).get_context_data(**kwargs) 
     context['form'] = CommentForm(initial={ 
      'article': self.object 
     }) 
     context['comments'] = self.object.comment_set.filter(approved=True) 
     return context 

    def post(self, request, *args, **kwargs): 
     self.object = self.get_object() 
     form = self.get_form() 

     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

    def form_valid(self, form): 
     form.save() 
     return super(ArticleView, self).form_valid(form) 

forms.py

class CommentForm(forms.ModelForm): 
    class Meta: 
     model = Comment 
     exclude = ('admitted',) 
     widgets = { 
      'article': forms.HiddenInput() 
     } 

的唯一途徑,我可以...設置該項目字段的值(這是一個外鍵爲文章)是在ArticleView中設置初始值。

如果有人有更好的選擇,我很高興看到它。