【问题标题】:Django how to add a form to a DetailView with FormMixinDjango 如何使用 FormMixin 将表单添加到 DetailView
【发布时间】:2022-01-23 16:49:54
【问题描述】:

我正在尝试将 cmets 的表单添加到 DetailView。 DetailView 显示特定项目的注释。所以 cmets 有一个外键是特定的笔记,而笔记有一个特定项目的外键。

我正在尝试将 FormMixin 与 DetailView 一起使用。到目前为止,我还没有成功。目前我可以让表单显示,但它没有保存,并且在终端中我看到以下错误Method Not Allowed (POST): /projects/project/1/note/1/

我可以让这些单独工作,但不能与 DetailView 中的表单一起工作。

这是我的模型:

class ProjectNotes(models.Model):
    title = models.CharField(max_length=200)
    body = tinymce_models.HTMLField()
    date = models.DateField(auto_now_add=True)
    project = models.ForeignKey(Project, default=0, blank=True, on_delete=models.CASCADE, related_name='notes')

    def __str__(self):
        return self.title
class ProjectNoteComments(models.Model):
    body = tinymce_models.HTMLField()
    date = models.DateField(auto_now_add=True)
    projectnote = models.ForeignKey(ProjectNotes, default=0, blank=True, on_delete=models.CASCADE, related_name='comments')

观点:

class ProjectNotesDetailView(DetailView, FormMixin):
    model = ProjectNotes
    id = ProjectNotes.objects.only('id')
    template_name = 'company_accounts/project_note_detail.html'
    comments = ProjectNotes.comments
    form_class = NoteCommentForm

    def form_valid(self, form):
        projectnote = get_object_or_404(ProjectNotes, id=self.kwargs.get('pk'))
        comment = form.save(commit=False)
        comment.projectnote = projectnote
        comment.save()
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('project_detail', args=[self.kwargs.get('pk')])

形式:

class NoteCommentForm(forms.ModelForm):
    class Meta:
        model = ProjectNoteComments
        fields =['body',]

        widgets = {
            'body': forms.TextInput(attrs={'class': 'form-control'})
        }

模板:

% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}
<div class="section-container container">
  <div class="project-entry">
    <h2>{{ projectnotes.title }}</h2>
    <p>{{ projectnotes.body | safe }}</p>
  </div>
  <div><b>Comments on {{projectnotes.title}}</b></div>
  {% if projectnotes.comments.all %}
    {% for comment in projectnotes.comments.all %}
        <div class="notecomments" style="padding: 10px;">
          
            {{ comment.body | safe }}
         
            
        </div>
      {% endfor %}
    {% else %}
    <p>No comments have been have been added yet.</p>
    {% endif %}
  
  <h2><a href="">add note</a></h2>
  
  <h1>Add Comment</h1>
  
   <form action="" method="post">
    {% csrf_token %}
    {{ form.media }}
    {{ form|crispy }}
    <input type="submit" value="save">
   </form>
  
{% endblock content %}

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    尝试在ProjectNotesDetailView中更改DetailViewFormMixin之间的顺序,然后实现post方法(由`FormMixin启用):

    class ProjectNotesDetailView(FormMixin, DetailView):
        model = ProjectNotes
        id = ProjectNotes.objects.only('id')
        template_name = 'company_accounts/project_note_detail.html'
        comments = ProjectNotes.comments
        form_class = NoteCommentForm
    
        def form_valid(self, form):
            projectnote = get_object_or_404(ProjectNotes, id=self.kwargs.get('pk'))
            comment = form.save(commit=False)
            comment.projectnote = projectnote
            comment.save()
            return super().form_valid(form)
    
        def get_success_url(self):
            return reverse('project_detail', args=[self.kwargs.get('pk')])
    
    
    
        def post(self, request, *args, **kwargs):
            if not request.user.is_authenticated:
                return HttpResponseForbidden()
            self.object = self.get_object()
            form = self.get_form()
            if form.is_valid():
                return self.form_valid(form)
            else:
                return self.form_invalid(form)
    

    查看如何use formmixin with detailview(文档)。

    【讨论】:

    • 成功了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2023-03-11
    相关资源
    最近更新 更多