我有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 文档中,您可以将FormMixin
与DetailView
一起使用,如下所示:
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)