Django 为什么在提交无效表单后,我会失去对上下文的访问权限?
因此,我有一个URL模式:Django 为什么在提交无效表单后,我会失去对上下文的访问权限?,django,django-views,django-forms,django-templates,Django,Django Views,Django Forms,Django Templates,因此,我有一个URL模式:path('/',PostDetailView.as_view(),name='detail') 我有一个看法: class PostCommentView(CustomLoginRequiredMixin,CreateView): template_name = 'blog/comment.html' model = Comment form_class = CommentForm def get_context_data(self,
path('/',PostDetailView.as_view(),name='detail')
我有一个看法:
class PostCommentView(CustomLoginRequiredMixin,CreateView):
template_name = 'blog/comment.html'
model = Comment
form_class = CommentForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['page'] = get_object_or_404(Post, pk = self.kwargs.get('pk'))
return context
def post(self, request,pk,slug):
if request.method == "POST":
form = self.form_class(request.POST)
post = get_object_or_404(Post, pk=pk)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
messages.success(request, (request, 'blog/post_detail.html', {'form': form, 'slug': post.slug, 'pk': post.id, 'username': post.author}))
return redirect('/' + str(post.id) +'/' + str(post.slug) + '/' +'#comment')
return render(request, 'blog/comment.html', {'form': form})
我有一个评论模型:
class Comment(models.Model):
title = models.CharField(max_length = 49,)
body = models.CharField(max_length = 250)
post = models.ForeignKey(Post,on_delete=models.CASCADE)
comment_date = models.DateTimeField(default = timezone.now)
author = models.ForeignKey(User, on_delete= models.CASCADE)
class Meta:
ordering = ["comment_date"]
def __str__(self):
return self.title
默认用户模型和Post模型:
class Post(models.Model):
title = models.CharField(max_length = 49)
content = models.TextField()
date_posted = models.DateTimeField(default = timezone.now)
author = models.ForeignKey(User, on_delete= models.CASCADE, default = 'NicholasPolino')
slug = models.SlugField(max_length = 250, null = True, blank = False)
category = models.ForeignKey(Category, default= 'programming', on_delete=models.PROTECT)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('detail', kwargs ={ 'slug': self.slug, 'pk':self.pk})
我有一个评论表:
class CommentForm(forms.ModelForm):
body = forms.CharField()
error_messages = {
'too_long': _("comment too long"),
}
class Meta:
model = Comment
fields = ['body']
def clean_body(self):
body = self.cleaned_data.get("body")
if len(body) > 5:
raise forms.ValidationError(
self.error_messages['too_long'],
code='too_long'
)
return body
然后我在模板“blog/comment.html”中找到了表单:
<form method="POST">
{%csrf_token%}
<fieldset class = "form-group">
<legend class = "border-bottom mb-2">Leave Your comment on <a href="{%url 'detail' page.pk page.slug%}">{{page.title}}</a></legend>
{{form|crispy}}
</fieldset>
<div class= "form-group">
<button class = "btn btn-outline-info" type ="submit">Post</button>
</div>
</form>
{%csrf_令牌%}
请留下您的评论
{{form | crispy}}
邮递
因此,如果我提交了一个有效的表单,一切正常,但是如果我提交了一个无效的表单,我会得到一个NoReverseMatch,它的“detail”的反面,并且没有找到参数(“”),“)。
错误。我不明白为什么模板会在无效表单之前而不是之后识别模板中的page.pk/page.slug{%url'detail'page.pk page.slug%}
非常感谢您的指导