2

私はできるようにしたい:

def update_profile(request, username):
    user = Profile.objects.get(user__username=username)

    # update subset of profile, eg value_to_company is set in request.POST
    # but user (or an arbitrary number of other attributes) is not
    profile = ProfileForm(request.POST, instance=user)

    if not profile.is_valid():
        print profile.errors  #user is required

これで私が抱えている問題は、ユーザーが確実に存在し、インスタンスの一部であり、インスタンスデータがバインドされたデータに入らないことを示唆するドキュメントが見つからないことです。しかし、それができると明示的に言っているものも見つかりませ

(残りの部分は、私が自分のやり方で物事を行っている理由の正当化と、解決策のアイデアです。おそらく読む必要はありません。)

なぜ私がフォームを使用しているのかを知りたい場合は、質問に不可欠ではありませんが、次のようなものがあるからです。

class Profile(models.Model):
    user = models.ForeignKey(auth.models.User)
    value_to_company = models.IntegerField()

class ValueField(forms.Field):
    def to_python(self, value):
        vals = {'high': 0,
                'mid': 1}
        return vals[value]

class ProfileForm(forms.ModelForm):
    value_to_company = ValueField()

    class Meta:
        model = Profile

つまり、私はすでに自分のフォームで type api-to-internal-representation-coercion を行っており、それを引き続き使用したいと考えています。

forms.is_valid() ループを再実装して、既に存在するフォームのフィールドをチェックするだけです。

# replaces `if not profile.is_valid()` above:
errors = []
for field in request.POST.iterkeys():
    if field in profile.fields:
        profile.fields[field].to_python()
        if not profile.fields['field'].clean():
            errors.append #something

(私はロジックの内部ロジックを実際に見ていないので、それが間違っていることはわかっていますが、その考えはわかります。)

4

2 に答える 2

0

この解決策django-pistonで見つけました。

merge_from_initial呼び出す前に呼び出す追加のフォームメソッドを追加is_validし、指定されたオブジェクトから不足しているフィールドを入力します。

私はそれを少し変更して使用しています:

class BaseModelForm(forms.ModelForm):
    """
    Subclass of `forms.ModelForm` which makes sure that the instance values are present in the form
    data, so you don't have to send all old values for the form to actually validate. Django does not
    do this on its own.
    """

    def merge_from_instance(self):
        # Internals
        self.data._mutable = True

        fun = lambda v: v not in self.data.keys()
        for field in filter(fun, self.fields.keys()):
            if field not in self.initial:
                continue
            value = self.initial.get(field)
            if isinstance(self.instance._meta.get_field(field), related.ManyToManyField):
                self.data.setlist(field, value)
            else:
                self.data[field] = value
于 2011-11-28T00:19:17.823 に答える
0

exclude = ('user',)おそらく、フォームに追加する必要があるだけです。フォームにユーザー フィールドが含まれている場合、ほとんどの場合、フォーム インスタンスによって初期値が決定されますが、そのフィールドに空白の値が設定されていると、ユーザー フィールドを空白しようとするため、エラーが発生します。

于 2011-10-06T16:40:47.850 に答える