Django - 现有模板中的评论表单。如何在views.py中定义它?

时间:2017-10-22 05:37:09

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

我有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})

3 个答案:

答案 0 :(得分:0)

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

 <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>

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

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

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

public class Crop extends RealmObject {
    @PrimaryKey
    public String publicId;
    public String cropName;
}

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

答案 1 :(得分:0)

我认为你需要的是基本的模型表单设置。

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

这是粗略的快速回答。 你的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 %}

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

答案 2 :(得分:0)

Django docs中,您可以将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)