2016-10-19 1 views
0

にリンクされているフォームのFKからChoice選択を変更します。モデルフロートピック→セクション→記事。Django:UpdateView

私は既に作成された記事を更新するFAQプロジェクトの更新ビューを構築しています。記事が作成されたトピックに基づいて、フォームがセクションの選択肢を提供するようにします。すでに記事PKがURLを通過しているので、私はフィルタを作成するときにトピックに戻るためにそれを使用することを望んでいました。テンプレートがUpdateAriticleFormのself.fields['section'].queryset = Section.objects.filter(topic_id=self.section.topic.id)行にフォームをレンダリングしようとしているときに、object has no attribute ‘section’エラーが表示されます。私は私のクエリフィルタを理解する助けが必要です。

URL:

url(r'^ironfaq/article/update/(?P<pk>\d+)/$', ArticleUpdateView.as_view()), 

フォーム:

from django import forms 
from .models import Topic, Section, Article 

class CreateArticleForm(forms.ModelForm): 

    section = forms.ModelChoiceField(queryset=Section.objects.none()) 

    def __init__(self, *args, **kwargs): 
     topic_pk = kwargs.pop('topic_pk') 
     super(CreateArticleForm, self).__init__(*args, **kwargs) 
     self.fields['section'].queryset = Section.objects.filter(topic_id=topic_pk) 

    class Meta: 
     model = Article 
     widgets = { 
      'answer': forms.Textarea(attrs={'data-provide': 'markdown', 'data-iconlibrary': 'fa'}), 
     } 
     fields = ('title','section','answer') 

class UpdateArticleForm(forms.ModelForm): 

    section = forms.ModelChoiceField(queryset=Section.objects.none()) 

def __init__(self, *args, **kwargs): 
    super(UpdateArticleForm, self).__init__(*args, **kwargs) 
    self.fields['section'].queryset = Section.objects.filter(topic_id=self.section.topic.id) 

    class Meta: 
     model = Article 
     widgets = { 
      'answer': forms.Textarea(attrs={'data-provide': 'markdown', 'data-iconlibrary': 'fa'}), 
     } 
     fields = ('title','section','answer') 

ビュー:

class ArticleUpdateView(UpdateView): 
    model = Article 
    form_class = UpdateArticleForm 
    template_name = "faq/form_create.html" 

    def form_valid(self, form): 
     article = form.save(commit=False) 
     article.activity_user = self.request.user.username 
     article.activity_date = datetime.datetime.now() 
     article.save() 
     self.success_url = "/ironfaq/%s/%s/%d" % (article.section.topic.slug,article.section.slug,article.id) 
     return super(ArticleUpdateView,self).form_valid(form) 

モデル:この問題に対する答えは、フォームの引数として'pk'を渡していませんでしたし、URLに渡された'pk'を見るために、フォームを有効にするには、ビューにget_form_kwargsを追加する

class Topic(Audit): 
    name = models.CharField(max_length=255) 
    icon = models.CharField(max_length=25,blank=True,null=True) 
    sort = models.SmallIntegerField() 
    slug = models.SlugField() 

    class Meta: 
     verbose_name_plural = "topics" 

    def __str__(self): 
     return self.name 

class Section(Audit): 
    name = models.CharField(max_length=255) 
    sort = models.SmallIntegerField() 
    slug = models.SlugField() 
    topic = models.ForeignKey(Topic,on_delete=models.CASCADE) 

    class Meta: 
     verbose_name_plural = "sections" 

    def __str__(self): 
     return self.name 

class Article(Audit): 
    title = models.CharField(max_length=255) 
    sort = models.SmallIntegerField() 
    slug = models.SlugField() 
    section = models.ForeignKey(Section,on_delete=models.CASCADE) 
    answer = models.TextField() 
    vote_up = models.IntegerField(default=0) 
    vote_down = models.IntegerField(default=0) 
    view_count = models.IntegerField(default=0) 

    class Meta: 
     verbose_name_plural = "articles" 

    def __str__(self): 
     return self.title 

答えて

0

フォーム:

class UpdateArticleForm(forms.ModelForm): 

    section = forms.ModelChoiceField(queryset=Article.objects.none()) 

    def __init__(self, pk, *args, **kwargs): 
     super(UpdateArticleForm, self).__init__(*args, **kwargs) 
     self.fields['section'].queryset = Section.objects.filter(topic_id__exact=Article.objects.filter(id=pk).first().section.topic.id) 

ビュー:

class ArticleUpdateView(UpdateView): 
    model = Article 
    form_class = UpdateArticleForm 
    template_name = "faq/form_create.html" 

    def get_form_kwargs(self): 
     kwargs = super(ArticleUpdateView,self).get_form_kwargs() 
     kwargs.update(self.kwargs) 
     return kwargs 

    def form_valid(self, form): 
     article = form.save(commit=False) 
     article.activity_user = self.request.user.username 
     article.activity_date = datetime.datetime.now() 
     article.save() 
     self.success_url = "/ironfaq/%s/%s/%d" % (article.section.topic.slug,article.section.slug,article.id) 
     return super(ArticleUpdateView,self).form_valid(form)