组合FormView和DetailView不会在页面上显示表单

时间:2018-04-21 21:46:12

标签: django django-class-based-views

我有一个DetailView,其中我显示了帖子的内容,我也希望为该视图添加评论功能。我发现了两种方法:组合DetailView和FormView或使用mixins创建自定义视图。由于我是Djanfgo的新手,我在第一道路上,在这个答案的引导下:Django combine DetailView and FormView但我只有一个提交按钮,没有字段填写页面。 这是一个必要的代码:

#urls.py
from . import views
app_name = 'bankofideas'
urlpatterns = [
    path('<int:pk>/', views.DetailView.as_view(), name='idea'),
    path('<int:idea_id>/vote', views.vote, name='vote'),
    path('<formview', views.MyFormView.as_view(), name='myform')

]

#views.py
class DetailView(generic.DetailView):
    model = Idea
    template_name = 'bankofideas/detail.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        return Idea.objects.filter(pub_date__lte=timezone.now())

    def get_context_data(self, **kwargs):  # передача формы
        context = super(DetailView, self).get_context_data(**kwargs)
        context['comment_form'] = CommentForm#(initial={'post': 
        self.object.pk})
        return context



class MyFormView(generic.FormView):
    template_name = 'bankofideas/detail.html'
    form_class = CommentForm
    success_url = 'bankofideas:home'


    def get_success_url(self):
         post = self.request.POST['post']
         Comment.objects.create()
         return '/'


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

#models.py
class Idea(models.Model):
    main_text = models.CharField(max_length=9001, default='')
    likes = models.IntegerField(default=0)
    pub_date = models.DateTimeField('date published', 
    default=timezone.now)

    def __str__(self):
        return self.main_text

    def save(self, *args, **kwargs):
        ''' On save, update timestamps '''
        if not self.id:
            self.pub_date = timezone.now()
        #self.modified = timezone.now()
        return super(Idea, self).save(*args, **kwargs)


class Comment(models.Model):
    post = models.ForeignKey(Idea, on_delete=models.PROTECT) # 
    related_name='comments',
    user = models.CharField(max_length=250)
    body = models.TextField(default=' ')
    created = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.body

    def get_absolute_url(self):
        return reverse('post_detail', args=[self.post.pk])


#forms.py
from .models import Idea, Comment
from django import forms


class IdeaForm(forms.ModelForm):
    class Meta:
        model = Idea
        fields = ('main_text',)


class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        exclude = ['post', 'datetime']

#detail.html
{% extends 'base.html' %}
{% load  bootstrap3 %}
{% block body %}
    <div class="container">
        <p>{{ idea.main_text }}   {{ idea.likes }} like(s)</p>

        {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
        <form action="{% url 'bankofideas:vote' idea.id %}" method="post">
            {% csrf_token %}
            <input type="submit" name="likes" id="idea.id" value="{{ idea.likes }}" />
        </form>
        {% for comment in idea.comment_set.all %}
            <p>{{comment.body}}</p>
        {% empty %}
            <p>No comments</p>
        {% endfor %}

        <form action="{% url "bankofideas:myform" %}" method="post">
            {% csrf_token %}
            {{ myform. }}
            <input type='submit' value="Отправить" class="btn btn-default"/>
        </form>

    </div>
{% endblock %}

因此,我有能力查看帖子,阅读所有评论,但不能发表评论。我试图在视图和模板中重命名该表单,但它不起作用。

问题是:如何在页面上添加评论表?

0 个答案:

没有答案