【问题标题】:2 apps in one view Posts and Comments in Django一个视图中的 2 个应用程序 Django 中的帖子和评论
【发布时间】:2018-07-24 15:04:45
【问题描述】:

Here is the screenshot of what I'm seeing.我有 2 个应用程序 Posts 和 cmets。我正在尝试查看帖子上的表格,但似乎无法显示该表格。 这是我的代码:

模型 - 帖子

from django.db import models
from django.utils import timezone
from django.conf import settings
from comments.models import Comment
from django.contrib.contenttypes.models import ContentType
from django.urls import reverse


class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    @property
    def comment_list(self):
            instance = self
            return Comment.object.filter_by_Post(instance)

    def get_absolute_url(self):
        return reverse("post_list")

    @property
    def get_content_type(self):
        instance = self
        content_type = ContentType.objects.get_for_model(instance.__class__)
        return content_type

评论模型

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

from django.utils import timezone
from django.conf import settings
from django.db import models
#from blog.models import Post



class CommentManager(models.Manager):
        def filter_by_Post(self, instance):

                    content_type = ContentType.objects.get_for_model(instance.__class__)
                    qs = super(CommentManager, self).filter(content_type=content_type, object_id = instance.id)
                    return qs


class Comment(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)

    object=CommentManager()


    def __str__(self):
        return str(self.user.username)

意见表

from django import forms
from datetime import datetime
from comments.models import Comment
from django.utils import timezone

class CommentForm(forms.Form):

    content_type = forms.CharField(widget=forms.HiddenInput)
    object_id = forms.IntegerField(widget=forms.HiddenInput)

    title = forms.CharField(max_length=200)
    text = forms.CharField()
    created_date = forms.DateTimeField(initial=timezone.now)

查看 - 帖子

def post_detail(request, pk=None):
    instance = get_object_or_404(Post, pk=pk)
    comments =instance.comment_list
    initial_data = {
        "content_type": instance.get_content_type,
        "object_id": instance.id
    }
    comment_form = CommentForm(request.POST or None, initial=initial_data)
    if comment_form.is_valid():
        c_type = comment_form.cleaned_data.get("content_type")
        content_type = ContentType.objects.get(model=c_type)
        obj_id = comment_form.cleaned_data.get("object_id")
        title = comment_form.cleaned_data.get("title")
        text = comment_form.cleaned_data.get("text")
        created_date = comment_form.cleaned_data.get("created_date")
        new_comment, created = Comment.object.get_or_create(
                            #user = request.user,
                            content_type= content_type,
                            object_id = obj_id,
                            title = title,
                            text = text,
                            created_date = created_date,
                        )
        return HttpResponseRedirect(new_comment.content_object.get_absolute_url())
        # if local variable 'context' referenced before assignment... this means that the context indentaion is off
    context = {
                              "instance": instance,
                              "comments": comments,
                              "comment_form":comment_form,

                              }
    return render(request, "blog/post_list.html", context)

网址-帖子

from django.conf.urls import url
from . import views
from comments.models import Comment
from comments.forms import CommentForm


urlpatterns = [
    url(r'^$', views.post_list, name='post_list'),
    url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'),
    url(r'^post/new/$', views.post_new, name='post_new'),
    url(r'^post/(?P<pk>\d+)/edit/$', views.post_edit, name='post_edit'),
    url(r'^drafts/$', views.post_draft_list, name='post_draft_list'),
    url(r'^post/(?P<pk>\d+)/publish/$', views.post_publish, name='post_publish'),
    url(r'^post/(?P<pk>\d+)/remove/$', views.post_remove, name='post_remove'),
    url(r'^search/$', views.post_search, name='post_search'),

post_list.html

{%extends 'blog/post_detail.html'%}

{% block content %}
<h1> Blogs</h1>
    {% for post in posts %}
        <div class="post">
            <div class="date">
              <div class="comment">

            <h5><a href="">{{ post.title }}</a></h5>
            <p>{{ post.text|linebreaksbr }}</p>
              {{post.published_date}}


            {%endfor%}


      </div>
<div>
<hr>
<H1> Comments</h1>

  <div>

    <p class='lead'>Comments</p>

    <form method="POST" action="."> {% csrf_token %}
        {{ comment_form.as_p }}
        <input type='submit' value='Save' class='btn btn-default'>
    </form>

    <hr/>
{% endblock %}

如果您能看到错误,请告诉我在哪里。在过去的两周里,我一直在努力解决这个问题。

谢谢,

【问题讨论】:

  • 如果有错误,那么您最好发布(完整)回溯。
  • 非常感谢您的反馈。但是没有错误,它只是不显示我可以看到按钮和标题但没有字段的文件。我会尝试上传截图。

标签: django django-forms django-templates django-views


【解决方案1】:

您看不到comment_form,因为它在detail_view 中呈现,而您正在查看list_view。您需要在list_view 函数中处理comment_form,您将能够看到它。我不知道在detail_view 中渲染post_list.html 有什么意义?希望这有用

【讨论】:

  • 你是个天才!!!!非常感谢它的工作。再见不眠之夜,直到下一个瓶颈:)
【解决方案2】:

试试这个。当你在视图中实例化一个表单时,这样做:

CommentForm(data=request.POST if request.POST else None, initial=initial_data)

代替:

CommentForm(request.POST or None, initial=initial_data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多