基于 Django 类的视图:发布表单数据返回 302 Found 状态码
Posted
技术标签:
【中文标题】基于 Django 类的视图:发布表单数据返回 302 Found 状态码【英文标题】:Django class based views: Posting form data returns 302 Found status code 【发布时间】:2018-08-10 11:29:55 【问题描述】:我正在使用 django 的基于通用类的视图 CreateView
将图像上传到一本书。代码如下:
# models.py
class Upload(models.Model):
image = models.ImageField(upload_to=get_upload_path, help_text='Image to process')
uploader = models.ForeignKey(settings.AUTH_USER_MODEL, models.CASCADE, related_name='uploader')
language = models.ForeignKey(Language, models.CASCADE)
book = models.ForeignKey(Book, models.CASCADE)
def __str__(self):
return str(os.path.split(self.image.name)[-1].split('_', 1)[-1])
@models.permalink
def get_absolute_url(self):
return ('book:upload_new', (self.book.id,)) # upload_new is linked to the view below
def save(self, *args, **kwargs):
super(Upload, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
self.image.delete(False)
super(Upload, self).delete(*args, **kwargs)
# views.py
@method_decorator(login_required, name='dispatch')
class PictureCreateView(CreateView):
model = Upload
fields = ("image",)
book_id = None
def dispatch(self, *args, **kwargs):
# book_id is passed as a URL parameter
self.book_id = self.kwargs['book_id']
return super().dispatch(*args, **kwargs)
def get_context_data(self, **kwargs):
context = super(PictureCreateView, self).get_context_data(**kwargs)
context['book_id'] = self.book_id
return context
def form_valid(self, form, **kwargs):
book = Book.objects.get(id=self.book_id)
form.instance.book = book
form.instance.language = book.language
form.instance.uploader = self.request.user
self.object = form.save()
# Running the command below prints
# <TemplateResponse status_code=200, "text/html; charset=utf-8">
# implying the upload was successful
#
# print(self.render_to_response(context=self.get_context_data()))
return super(PictureCreateView, self).form_valid(form)
def form_invalid(self, form):
print(form.errors)
data = json.dumps(form.errors)
return HttpResponse(content=data, status=400, content_type='application/json')
当我尝试上传图片时,我收到此请求的302 Found
错误(如在我的浏览器的开发工具中所见),暗示页面已临时移动。除了标头之外,我看不到此请求的预览或响应。上传成功了(我在管理页面中检查了)。
有人之前有this issue,答案指出了URL conf中的错误。但是,问题并没有完全解决,OP 仍然得到 302 状态码。
这可能是什么原因?
【问题讨论】:
302 Found 不是错误。在成功的 POST 请求后返回 302 重定向是标准做法。 您在 form_valid 中的打印声明无关紧要。超类方法的默认动作是返回一个重定向; self.render_to_response 根本不会被调用。 到目前为止我看到的所有 POST 请求都返回了 200 状态码。由于another issue,我很想知道这一点,我想了解我为什么得到 302 可能会对我有所帮助解决这个问题。 不。 POST 不应返回 200。但您被重定向到的下一个 url 通常应返回 200。 django 中的所有通用表单视图都继承自FormMixin
,后者从 form_valid
方法返回重定向。 ccbv.co.uk/projects/Django/1.11/django.views.generic.edit/…
【参考方案1】:
默认情况下,form_valid
方法使用 302 代码重定向到 success_url
(可以通过覆盖 get_success_url
动态生成)。所以这是正常行为,我认为这是一个很好的做法。所以我不会改变它。
但如果你真的想,你可以返回任何其他响应代码,例如:一个 200 与 get 内容相似的代码
# views.py
@method_decorator(login_required, name='dispatch')
class PictureCreateView(CreateView):
...
def form_valid(self, form, **kwargs):
book = Book.objects.get(id=self.book_id)
form.instance.book = book
form.instance.language = book.language
form.instance.uploader = self.request.user
self.object = form.save()
context = self.get_context_data()
# You may have check and modify your context for a correct page
# May be: add new things
context["success"] = True
return self.render_to_response(context))
【讨论】:
以上是关于基于 Django 类的视图:发布表单数据返回 302 Found 状态码的主要内容,如果未能解决你的问题,请参考以下文章