12

create_dateモデルフォームがあり、とフィールドの 2 つのフィールドを除外しましたcreated_by。が空でsave()あるため、メソッドを使用すると「Not Null」エラーが発生します。created_by

save()次のようなメソッドの前に、フォームにユーザー ID を追加しようとしましform.cleaned_data['created_by'] = 1form.cleaned_data['created_by_id'] = 1。しかし、これはどれも機能しません。

送信されたモデルフォームに追加のものを「追加」して保存する方法を誰かが説明してもらえますか?

class Location(models.Model):
    name = models.CharField(max_length = 100)
    created_by = models.ForeignKey(User)
    create_date = models.DateTimeField(auto_now=True)

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        exclude = ('created_by', 'create_date', )
4

4 に答える 4

19

created_byフィールドとフォームを除外したため、フィールドcreate_dateを割り当てようとしてform.cleaned_dataも意味がありません。

できることは次のとおりです。

ビューがある場合は、単に使用form.save(commit=False)して値を設定できますcreated_by

def my_view(request):
    if request.method == "POST":
        form = LocationForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.created_by = request.user
            obj.save()
        ...
        ...

`

Admin を使用している場合は、save_model()メソッドをオーバーライドして目的の結果を得ることができます。

class LocationAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.created_by = request.user
        obj.save()
于 2011-04-29T12:34:11.507 に答える
5

ユーザーをパラメーターとしてフォーム コンストラクターに渡し、それを使用してモデル インスタンスの created_by フィールドを設定します。

def add_location(request):
    ...
    form = LocationForm(user=request.user)
    ...

class LocationForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(forms.ModelForm, self).__init__(*args, **kwargs)
        self.instance.created_by = user
于 2011-04-29T12:26:51.737 に答える
2

正しい解決策は、事前に入力されたフィールドを持つオブジェクトのインスタンスをモデル フォームのコンストラクターに渡すことです。そうすれば、フィールドは検証時に入力されます。フィールドが必須の場合、後で値を割り当てるform.save()と検証エラーが発生する可能性があります。

LocationForm(request.POST or None, instance=Location(
    created_by=request.user,
    create_date=datetime.now(),
))

インスタンスは保存されていないオブジェクトであるため、フォームが保存するまで ID は割り当てられないことに注意してください。

于 2016-06-16T13:16:39.130 に答える
0

これを行う 1 つの方法は、 form.save(commit=False) ( doc )を使用することです。

これにより、データベースにコミットせずにモデル クラスのオブジェクト インスタンスが返されます。

したがって、処理は次のようになります。

form = some_form(request.POST)
location = form.save(commit=False)
user = User(pk=1)
location.created_by = user
location.create_date = datetime.now()
location.save()
于 2011-04-29T12:27:14.160 に答える