我可以在django-html中添加一个表单吗



我想从一个有自己视图和模型的特定html中添加注释,我不想创建一个像comment.html这样只显示表单及其视图的新html文件。我希望用户能够在帖子下面发表评论,这样用户就不必点击诸如";添加评论";这将带他们进入一个新的页面;comment.form";然后他们可以发表评论。但我被卡住了。我可以从管理页面手动添加评论,这很好,但似乎我必须创建另一个url和html文件来显示评论表单,让用户能够添加评论(顺便说一句,我正在尝试建立一个体育相关网站(。提前感谢!

我的型号.py:

class Transfernews(models.Model):
player_name = models.CharField(max_length=255)
player_image = models.CharField(max_length=2083)
player_description = models.CharField(max_length=3000)
date_posted = models.DateTimeField(default=timezone.now)
class Comment(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
transfernews = models.ForeignKey(Transfernews, related_name="comments", on_delete=models.CASCADE)
body = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return '%s - %s' % (self.transfernews.player_name, self.user.username)

我的表格.py:

class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('body',)

我的观点.py:

def addcomment(request):
model = Comment
form_class = CommentForm
template_name = 'transfernews.html'

我的网址.py:

path('comment/', views.addcomment, name='comment'),

我的transfernews.html:

<h2>Comments...</h2>
{% if not transfernew.comments.all %}
No comments Yet...
{% else %}
{% for comment in transfernew.comments.all %}
<strong>
{{ comment.user.username }} - {{ comment.date_added }}
</strong>
<br/>
{{ comment.body }}
<br/><br/>
{% endfor %}
{% endif %}
<hr>
<div>Comment and let us know your thoughts</div>
<form method="POST">
{% csrf_token %}
<div class="bg-alert p-2">
<div class="d-flex flex-row align-items-start"><textarea class="form-control ml-1 shadow-none textarea"></textarea></div>
<div class="mt-2 text-right"><button class="btn btn-primary btn-sm shadow-none" type="submit"> <a href="{% url 'comment' %}"></a>
Post comment</button><button class="btn btn-outline-primary btn-sm ml-1 shadow-none" type="button">Cancel</button></div>
</div>
</div>
</form>

我在这里做了一些假设,如果这个建议是多余的,我很抱歉,但我认为你想要的是一个基于函数的视图,我认为你已经尝试过使用它,但你在中混合了基于函数和类的视图的元素

def addcomment(request):
model = Comment
form_class = CommentForm
template_name = 'transfernews.html'

看看这个例子,它当然不适合你代码的所有需求,因为我不知道你项目的所有细节,但你应该能够看到视图函数在你的情况下是如何工作的。我调用了视图函数display_transfer_news,只是为了将其与添加注释的单独页面解除关联。

views.py

from django.shortcuts import render, redirect
from .forms import CommentForm
from .models import Transfernews
def display_transfer_news(request):
# Grab all Transfernews objects in database
transfernews = Transfernews.objects.all()
# create a blank form for get requests
form = CommentForm()
# This block runs only when comment form is posted to this view
if request.method == 'POST':
# populate form object with data from the commentform
form = CommentForm(request.POST)
# If there are any errors in the form we don't redirect but just render the page with the form errors.
if form.is_valid():
# creates a comment in the database
form.save()
# If the save was successful we redirect to this same view which will grab the new comment we just made when calling Transfernews.objects.all() again
return redirect(display_transfer_news)
# format for render is render(request, template, context)
return render(
request,
"transfernews.html",
# This dictionary is the context object
{ 
"comment_form": form,
"transfer_news": transfernews
}
)

urls.py中的相应路径看起来像这样,例如

path('whatever-your-transfernews--page-url-is', views.display_transfer_news)

在您的视图中,您将使用视图中上下文字典中的名称来显示您的注释表单和transfernews对象。

transfernews.html

{% if not transfer_news.comments.all %}
No comments Yet...
{% else %}
{% for comment in transfer_news.comments.all %}
<strong>
{{ comment.user.username }} - {{ comment.date_added }}
</strong>
<br/>
{{ comment.body }}
<br/><br/>
{% endfor %}
{% endif %}
<hr>
<div>Comment and let us know your thoughts</div>
<form method="POST">
{% csrf_token %}

<!-- Haven't styled the form as it's just an example -->
{{ comment_form.as_p }}
<button class="btn btn-primary btn-sm shadow-none" type="submit">Post comment</button>
</div>
</div>
</form>

从我的角度来看,这是我认为你正在努力的方向。没有额外的页面来创建评论。从中获取你想要的,因为它只是一个指南。

我对您的问题的解释就像您想要一个包含所有转会新闻及其各自评论的页面,以及旧评论下的评论表单一样。

这是一种常见的情况,使用泛型视图可能是有益的,更具体地说是FormView。棘手的部分是重组内容,这样你就可以将CommentForm创建的评论与正确的Transfernews和User链接起来。

所以我要做的是:

  1. 保留现有的模型
  2. 编辑CommentForm类,使其也具有字段usertransfernews(请参见下文(
  3. 创建一个继承自django.views.generic.FormView的新视图。您将需要更改一些内置方法。主要是CCD_ 8和CCD_。第一种是为了获得显示所有transfernews和早期评论所需的所有信息,第二种是为了给表单提供所有必要的信息。您还需要重写有效的表单以保存创建的实例。这样的方法应该有效:
from django.forms import ModelForm
from django.views.generic import FormView
from transfer.models import Comment, Transfernews

class CommentForm(ModelForm):
class Meta:
model = Comment
fields = ('body', 'user', 'transfernews')

def __init__(self, *args, **kwargs):
super(CommentForm, self).__init__(*args, **kwargs)

class TransfernewsView(FormView):
template_name = 'transfernews.html'
form_class = CommentForm
success_url = '/transfers'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({
'transfernews': [
{'news': transfer, 'comments': Comment.objects.all().filter(transfernews=transfer.id)}
for transfer in Transfernews.objects.all()
]
})
return context
def get_form_kwargs(self):
form_kwargs = super().get_form_kwargs()
if self.request.method in ('POST', 'PUT'):
form_kwargs['data'] = form_kwargs['data'].copy()
form_kwargs['data'].update({'user': self.request.user})

return form_kwargs
def form_valid(self, form):
form.save()
return super(TransfernewsView, self).form_valid(form)
  1. 更新urls.py,以便使用新视图,如下所示:path('transfers/', views.TransfernewsView.as_view(), name='transfers'),

  2. 更新HTML文件,使每个transfernews显示所有注释,并有自己的表单。此表单必须同时包含body字段和带有transfernews.id的隐藏字段。下面是一具骨架。

<h1>Transfers</h1>
{% for transfer in transfernews %}
Information on the transfer of player: {{ transfer.news.player_name }}
...
{% for comment in transfer.comments %}
<h5>Comment by {{ comment.user.username }}</h5>
<div>{{ comment.body }}</div>
{% endfor %}
<from method='POST'>
{% csrf_token %}
<input id="transfernews" type="hidden" name="transfernews" value="{{ transfer.news.id }}">
<input id="body" type="text" name="body">
<input type="submit" value="Send comment"> 
</form>
{% endfor %}

我希望这能有所帮助!

您还应该研究在编写HTML表单时使用内置表单字段,即使用{{ form.body }}而不是使用<input id="body" type="text" name="body">。我看到你在使用引导程序。自动引导程序样式的一个选项是脆形式。你应该调查一下;(

最新更新