我有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})
答案 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中,您可以将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)