1

私はこのform.pyを持っています:

 from shortcut import get_timezone
 class HostCreateForm(forms.ModelForm):
     def save(self, commit=True):
         host1 = super(HostCreateForm, self).save(commit=False)
         user = request.user.username 
         host1.timezone=get_timezone(user=user)
         host1.save()
         return host1

 class Meta:
     model = Host
     widgets = {
         'user': forms.HiddenInput(),
         'timezone': forms.HiddenInput()
     }
    timezoneは、model.py で定義されたホスト モデルからの入力非表示フィールドです。
    get_timezoneメソッド: (次のように定義)
 def get_timezone(user=None):
 timezone = Userprofile.objects.all()
 timezone = timezone.get(user=user)
 return timezone.timezone

一方、UserProfile は、models.py で定義されている別のモデルであり、登録時にユーザーの timezone 、姓名を保存するために使用されます。私の主な動機は、このデフォルトのタイムゾーンを Userprofile モデルから取得し、非表示の入力フィールド (タイムゾーン) に渡すことです。get_timezone メソッドを呼び出す save メソッドで記述された上記のコード (host1.timezone=get_timezone(user=user) を試してみましたが、ログインしたユーザーの Userprofile モデルからタイムゾーンを返す必要がありますが、うまくいきませんでした。

主な問題は、save メソッドから get_timezone メソッドを呼び出すときに、要求しているユーザーの名前を渡すことにあると思います。私にはそれができません。現在のシナリオから、次のエラーが発生しています: グローバル名 'request' が定義されていません

どんな助けもかなりのものになるでしょう

4

1 に答える 1

2
timezone = timezone.filter(user=user)
return timezone.timezone

timezone.filter(...)はクエリセットを返しますが、クエリセットを呼び出すことはできません.timezone。次のいずれかを使用して、関連オブジェクトを取得する必要がありますget

timezone = timezone.get(user=user)

またはリストスライスによる:

timezone = timezone.filter(user=user)[0]

更新:わかりました、私はそれに気づきました。

save問題は、リクエスト オブジェクトをフォームのメソッドに渡すことができないことです。この問題に対処する最善の方法は、ビュー レイヤーで実行することです。

あなたの見解では:

my_form = HostCreateForm(request.POST):
    if my_form.is_valid(): #do the validation
        my_inst = my_form.save(commit=False) #pass the form values to a new model instance without saving.
        my_inst.timezone = request.user.username #set the user or do whhatever you want eith the form data.
        my_inst.save() #that will call your save methhod that you override.

そして、saveメソッドからユーザーを設定する部分を削除します。

于 2012-05-22T08:44:13.110 に答える