2011-08-11 3 views
1

私はモデルに新しいフィールドを追加して汎用モデルを更新するために、管理者用のdjangoフォームを作成しました。そのすべては、現在ログインしているユーザーの保存を完全に受け入れます。 save()メソッドでは、私はcreated.byフィールドに値を設定するためにrequest.userにアクセスすることはできません。管理者はリクエストからユーザーフィールドを取り込みます

class EventAdminForm(forms.ModelForm): 
    tag_it = forms.CharField(max_length=100) 

    class Meta: 
     model = Event 

    # Step 2: Override the constructor to manually set the form's latitude and 
    # longitude fields if a Location instance is passed into the form 
    def __init__(self, *args, **kwargs): 
     super(EventAdminForm, self).__init__(*args, **kwargs) 

     # Set the form fields based on the model object 
     if kwargs.has_key('instance'): 
      instance = kwargs['instance'] 
      self.initial['tag_it'] = ', '.join([i.slug for i in instance.tags.all()]) 



    def set_request(self, request): 
     self.request = request 
    # Step 3: Override the save method to manually set the model's latitude and 
    # longitude properties based on what was submitted from the form 
    def save(self, commit=True): 
     model = super(EventAdminForm, self).save(commit=False) 

     for i in self.cleaned_data['tag_it'].split(','): 
      model.tags.create(slug=i, created_by=User.objects.get(username='mazban')) 


     if commit: 
      model.save() 

     return model 

class EventForm(admin.ModelAdmin): 
    exclude = ('published_by', 'published_at', 'updated_at', 'updated_by',) 
    form = EventAdminForm 

答えて

3

@brandonからの返信とあなたのコメントを参考にして、それらを組み合わせることができます:

# admin.py 

# don't override EventAdminForm's save(). Instead implement it here:   

class EventAdmin(admin.ModelAdmin): 
    exclude = ('published_by', 'published_at', 'updated_at', 'updated_by',) 
    form = EventAdminForm 

    def save_model(self, request, obj, form, change): 
     obj.save() 
     obj.tags.all().delete() 
     for i in form.cleaned_data['tag_it'].split(','): 
      obj.tags.create(slug=i, created_by=request.user) 
+0

あなたは私の問題を解決してくれてありがとう:) –

2

管理における要求へのアクセスを得るために、あなたはModelAdminののsave_model方法オーバーライドする必要があります:

例:詳細については

def save_model(self, request, obj, form, change): 
    if not change: 
     obj.author = request.user 
    obj.save() 

、ドキュメントを確認してください。https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#modeladmin-methods

+0

上記のコードでは、ユーザーIDが必要な一般的な関連フィールドを作成しようとしています。 ModelAdmin内のコードを書き直すのはむしろ難しくなりますが、私はEventFormAdminにリクエストを渡すことができますか? –

+0

Hmm。私は、Django amdin内のModelAdminのフォームにリクエストを渡す方法が不明です。管理者以外でもやりやすいですが、私はまだ管理者の中でこのユースケースに取り組んでいません。 – Brandon

関連する問題