1

次のように( )を使用してheight属性を更新できます。MyLittleModelMyModelFormOneToOneField(MyLittleModel)

models.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")

urls.py

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

ビューだけでなく ModelForm でもコードを変更する必要があるため、これは適切なコーディング スタイルではないと思います。

my_little_model.height私のようにビューコードを変更せずに値を設定することは可能ですか?

:この質問のタイトルが好きではありません。誰かがもっと読みやすい名前に変更することを提案している場合は、私に知らせてください。

4

1 に答える 1

1

次のように、あなたMyModelFormの save メソッドをオーバーライドすることでこれを行います。

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")

このようにして、モデル情報を更新するためのすべてのロジックがフォーム内に存在します。更新対象を変更したい場合は、すべて 1 か所で行うことができます。

于 2013-07-11T19:24:12.517 に答える