Django - 现有模板中的注释表单.如何在 views.py 中定义它



我有4个模型:帖子,评论,博主和用户。

我有一个post_description模板,在下面,我放置了一个评论表。

但是如何在视图中定义它呢?我的问题是 - 获取其用户名,例如登录的用户将被存储为"posted_by",他发布的博客文章将存储为博客的"主题"。

如何存储这些信息,以便自动添加它们?

我在post_desc.html中描述的形式

{% if user.is_authenticated %}
  <form method="post">
    {% csrf_token %}
    <input type="text" name="comment" style="width: 800px; height: 145px;">
    <button type="submit">Submit Comment</button>
  </form>
{% else %}
  <p><a href="{% url 'login' %}">Login</a> to comment</p>
{% endif %}

该post_desc的当前视图:

def post_desc(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'post_desc.html', {'post': post})

现在,可以在视图中按如下方式访问用户:

user = request.user

关于主题,也许您可以在表单中添加隐藏输入以获取博客ID,因为您已经在表单模板中传递帖子。

 <form method="post">
{% csrf_token %}
<input type="text" name="comment" style="width: 800px; height: 145px;">
<input type="hidden" name="topic" value="{{ post.id }}">
<button type="submit">Submit Comment</button>

当发布在视图中时,您可以通过以下方式获得博客:

post_id = request.POST.get('topic')
post = get_object_or_404(Post, pk=post_id)

然后最后继续您的实际流程。

我认为您在这里需要的是基本的模型表单设置。

我希望有一个博客条目和与之相关的评论,并且您希望对每篇文章都有评论功能。

这是粗略的快速答案。您的 models.py 如下所示:

从 Django 导入模型.db从 django.conf 导入设置

class Comments(models.Model):
    posted_by = models.ForeignKey(settings.AUTH_USER_MODEL)
    topic = models.ForeignKey(Blog)
    comment = models.TextField()
    last_modified = models.DateTimeField(auto_now=True)
    created_on = models.DateTimeField(auto_now_add=True)

在 forms.py 中设置模型窗体

from django.forms import ModelForm
from .models import Comments
class CommentForm(ModelForm):
    class Meta:
        model = Comments
        fields = ['comment']

设置模型窗体后视图。

@login_required
@require_http_methods(["POST"])
def post_comments_controller(request, identifier):
    from .forms import CommentForm
    comment_form = CommentForm(request.POST or None)
    if comment_form.is_valid():
        comment_obj = comment_form.save(commit=False)
        topic = Blog.objects.get(id=identifier)
        comment_obj.posted_by = request.user
        comment_obj.item = topic
        comment_obj.save()
        return HttpResponse("Done")
    else:
        return HttpResponseBadRequest()

在 urls.py 中设置入口点

from django.conf.urls import patterns, url
from django.conf import settings
urlpatterns = patterns('',
                       url(r'^/blog/(?P<identifier>[d]+)/comment$',
                           'views.post_comments_controller', name='post_comment')
)

最后是 html 表单

{% if user.is_authenticated %}
  <form method="POST" action="{% url 'post_comment' blog.id %}">
    {% csrf_token %}
    <input type="text" name="comment" style="width: 800px; height: 145px;">
    <button type="submit">Submit Comment</button>
  </form>
{% else %}
  <p><a href="{% url 'login' %}">Login</a> to comment</p>
{% endif %}

这没有经过全面测试。让我知道。

从 Django 文档中,您可以将FormMixinDetailView一起使用,如下所示:

class AuthorInterestForm(forms.Form):
    message = forms.CharField()
class AuthorDetail(FormMixin, DetailView):
    model = Author
    form_class = AuthorInterestForm
    def get_success_url(self):
        return reverse('author-detail', kwargs={'pk': self.object.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)
    def form_valid(self, form):
        # Here, we would record the user's interest using the message
        # passed in form.cleaned_data['message']
        return super().form_valid(form)

相关内容

最新更新