1

我可以更新using ( ) 的height属性,如下所示:MyLittleModelMyModelFormOneToOneField(MyLittleModel)

模型.py

class MyLittleModel(models.Model):
    height = models.IntegerField()
    has_color = models.NullBooleanField(null=True, blank=True)


class MyModel(models.Model):
    my_little_model = models.OneToOneField(MyLittleModel)
    age = models.IntegerField()
    is_male = models.BooleanField(default=False)

表格.py

class MyModelForm(forms.ModelForm):
    height = forms.IntegerField(max_length=30)

    class Meta:
        model = MyModel
        fields = ("height", 
          "age")

视图.py

class MyUpdateView(UpdateView):
    form_class = MyModelForm
    model = MyModel
    template_name = 'my_template.html'

    def form_valid(self, form):
        my_little_model = MyLittleModel.objects.create(form.cleaned_data["height"])
        form.instance.my_little_model = my_little_model
        form.instance.save()
        return super(MyUpdateView, self).form_valid(form)

    def get_success_url(self):
        return reverse("my_list_view")

网址.py

urlpatterns = patterns('',
    url(regex=r'^update/(?P<pk>\d+)/$', view=MyUpdateView.as_view(), name="my_update_view"),
)

我认为这不是一种好的编码风格,因为这会迫使您在 ModelForm 和 View 中修改代码,最好只在一个位置发生这种情况。

那么是否可以在my_little_model.height不修改我的视图代码的情况下设置一个值?

注意:我不喜欢这个问题的标题,如果有人建议将其重命名为更具可读性的名称,请告诉我。

4

1 回答 1

1

我会通过覆盖你MyModelForm的保存方法来做到这一点,如下所示:

class MyModelForm(forms.ModelForm):
    height = forms.CharField(max_length=30)

    class Meta:
        model = MyModel
        fields = ("height",
          "age")

    def save(self, *args, **kwargs):
        my_little_model = MyLittleModel.objects.create(height=self.cleaned_data["height"])
        self.instance.my_little_model = my_little_model
        self.instance.save()
        return super(MyModelForm2, self).save(*args, **kwargs)

然后你的观点变成:

class MyUpdateView(UpdateView):
    template_name = "my_template.html"
    form_class = MyModelForm
    model = MyModel

    def get_success_url(self):
        return reverse("my_list_view")

这样,您更新模型信息的所有逻辑都存在于表单中 - 如果您想更改正在更新的内容,您可以在一个地方完成所有操作。

于 2013-07-11T19:24:12.517 回答