2011-06-01 50 views
0

我对今天发布的所有问题表示歉意,但我对这个问题感到心有余而力不足。Django - 验证并保存带有editable = false字段的ModelForm

我想制作一个Q &视频网站的一个东西,我试图让问题通过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:用jQuery的AJAX请求发送

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 

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' 对象没有属性 'cleaned_data'”。

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

对任何能够帮助的人来说,我欠你的理智。

回答

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,你应该检查是否有),这是一个有效的POST,和b)这是一个Ajax请求

def question_submit(request): 
    if request.method == "POST" and request.is_ajax(): 
     ... 
+0

啊是的。我将视频切换到位置,并忘记将其改回。当我在视图中调用它时,我正在做QuestionForm(v)而不是QuestionForm(video = v)。再次感谢pastylegs。 – bcoughlan 2011-06-01 23:19:54

0

它看起来像你的request.POST是空的。你确定数据是通过POST方法发送的吗?检查

if request.method == 'POST: 

或使用

q=QuestionForm(request.REQUEST) 

获得POST/GET数据。

相关问题