我为今天发布的所有问题道歉,但我对此束手无策。
我正在试着做一个问答;这是一个视频网站的事情,我正试图通过AJAX提交这个问题。
问题模型:
class Question(models.Model):
user = models.ForeignKey(User, editable=False)
video = models.ForeignKey(Video, editable=False)
section = models.ForeignKey(Section, editable=False)
title = models.CharField(max_length=255)
description = models.TextField(null=True, blank=True)
型号形式:
class QuestionForm(ModelForm):
def __init__(self, video, *args, **kwargs):
super(QuestionForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['section'].queryset = Section.objects.filter(video=video)
class Meta:
model = Question
jQuery的AJAX请求发送的POST参数(视频参数由Javascript代码添加):
section=6&title=test&description=test&video=1
最后,以下是我正在处理提交的视图:
def question_submit(request):
u = request.user
if u.is_authenticated():
q=QuestionForm(request.POST)
if q.is_valid():
logger.debug("YES!")
else:
logger.debug("NO!")
f=q.save(commit=False)
f.user=u
f.video_id=int(request.POST['video'])
f.save()
return HttpResponse("OK")
else:
return JsonResponse({'failed': 'You are not logged in. Try logging in in a new tab, then re-submit your question.'})
正如文档所建议的,我保存时使用commit=false,这样我就可以修改对象了。
我有两个问题:
当它达到q.is_valid()时,它抛出错误"'QuestionForm'对象没有属性'cleaned_data'"。
如果我去掉q.is_valid()位,则f.save()成功,但它会在数据库中插入一个空行。
对于任何能帮忙的人,我欠你理智。
您没有在视图中传入视频:
表单.py
def __init__(self, video, *args, **kwargs):
视图.py
q=QuestionForm(request.POST)
由于视频是一个位置论点,我想它是解释请求。POST作为视频?
您可以将视频更改为关键字参数:
def __init__(self, video=None, *args, **kwargs):
if video:
...
作为提示,您应该检查a)它是否是有效的POST,b)它是否为ajax请求
def question_submit(request):
if request.method == "POST" and request.is_ajax():
...
这看起来像是您的请求。POST为空。你确定数据是通过POST方法发送的吗?,检查
if request.method == 'POST:
或使用
q=QuestionForm(request.REQUEST)
以获取POST/get数据。