我为我今天发布的所有问题道歉,但我最终在这个问题上结束了。
我正在尝试为视频网站制作一个Q& A的东西,而我正试图通过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)
的ModelForm:
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.'})
根据docs的建议,我使用commit = false保存,以便我可以修改对象。
我有两个问题:
当它到达q.is_valid()时,它会抛出错误“'QuestionForm'对象没有属性'cleaning_data'”。
如果我取出q.is_valid()位,f.save()会成功,但会在数据库中插入一个空行。
对任何可以提供帮助的人,我都应该为你理智。
答案 0 :(得分:2)
您未在视图中传递视频:
<强> forms.py 强>
def __init__(self, video, *args, **kwargs):
<强> views.py 强>
q=QuestionForm(request.POST)
因为视频是一个位置参数,我想它会解释request.POST作为视频?
您可以将视频更改为关键字参数:
def __init__(self, video=None, *args, **kwargs):
if video:
...
作为mordi metions,你应该检查a)它是否是有效的POST,b)它是ajax请求
def question_submit(request):
if request.method == "POST" and request.is_ajax():
...
答案 1 :(得分:0)
看起来像你的request.POST是空的。你确定通过POST方法发送数据吗?,检查
if request.method == 'POST:
或使用
q=QuestionForm(request.REQUEST)
获取POST / GET数据。