无法使用Django UpdateView更新数据库

时间:2014-08-20 17:59:33

标签: django django-forms django-class-based-views

我正在使用Django的UpdateView(1.5.8)来更新我的数据库中的对象。我编辑问题对象并点击提交;它没有给我任何错误,但它也没有更新问题。

我在views.py中有我的QuestionUpdate类,它扩展到UpdateView:

class QuestionUpdate(UpdateView):  
    model = Question
    form_class = QuestionForm
    success_url = '.'

    def get_context_data(self, **kwargs):
        context = super(QuestionUpdate, self).get_context_data(**kwargs)
        return context  

我用urls.py调用QuestionUpdate:

url(r'^question/(?P<pk>\d+)/$',QuestionUpdate.as_view(), name='question_update', ),

在模板中,我使用Bootstrap form-group。我显示一个文本区域,其默认值是原始问题。 这是我的模板(我只复制相关部分 - 表格):

        <form action = "" method ="post"> {% csrf_token %}

        <div class='form-group'>
                <label>Question</label>
                <textarea class='form-control' rows="3">{{question}}</textarea>
            </div>

            <input type = 'submit' value = 'Submit' />

        </form> 

我找到了this,但它并没有给我这么多帮助。我错过了什么?

我怀疑有两件事:

  1. 当我用updateview显示问题时,我将pk传递给url。我在网址上使用 reverse()看到了一些UpdateView示例。我不知道我是否需要它或为什么需要它。那可能是问题?

  2. 在我的表单中,我只显示question_text,但问题模型中还有其他字段。我是否因为&#39; 隐藏字段而感到麻烦&#39;?

  3. 编辑: 以下是问题模型和QuestionForm模型表单:

    models.py:

    class Question(models.Model):
        question_text = models.TextField()
        question_type = models.CharField(choices = Option_type, max_length = 64)
        calculate = models.CharField(choices=Calculation, blank = True, max_length = 64)
        ordering = models.IntegerField()
        scale_id = models.IntegerField()
        scale = models.ForeignKey(Scale)
        max_score_of_question = models.IntegerField()
        showQues = models.IntegerField(default = 1)
    
    
        def __unicode__(self):
            return self.question_text
    

    forms.py

    class QuestionForm(ModelForm):
        class Meta:
            model = Question
    #         fields = ('question_text',)
    

1 个答案:

答案 0 :(得分:1)

问题是您有列scale_idscale。请参阅 - 如果有ForeignKey,它还会生成一个名为列+后缀_id的属性,在这种情况下,scale_id会与已经存在的列scale_id发生冲突

只需重命名或删除其中一个。