Django - 使用editable = false字段验证和保存ModelForm

时间:2011-06-01 22:41:27

标签: django django-models django-forms

我为我今天发布的所有问题道歉,但我最终在这个问题上结束了。

我正在尝试为视频网站制作一个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保存,以便我可以修改对象。

我有两个问题:

  1. 当它到达q.is_valid()时,它会抛出错误“'QuestionForm'对象没有属性'cleaning_data'”。

  2. 如果我取出q.is_valid()位,f.save()会成功,但会在数据库中插入一个空行。

  3. 对任何可以提供帮助的人,我都应该为你理智。

2 个答案:

答案 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数据。