2012-01-31 10 views
1

this questionに関するいくつかのコメントは、より簡単で最新の解決策があることを示しています。 (私は何も見つけられませんでした)Django Admin:親モデルに基づいてインラインの外部キーフィールドを事前に準備する方法

(コメントは次のようになります: "はい、それは解決されました。パラメータで関連するインスタンスを渡すだけで、あらかじめ入力します..."

私は、特定のイベントに関与し、管理者によって選択された一部のユーザーに通知を送信したいと思っています。 スタッフメンバーがイベントのページにあり、イベントを選択して保存します。インラインのfkフィールドは、関連するユーザー名をあらかじめ入力しておく必要があります。 (そしてスタッフメンバーに確認を依頼するか、電子メール通知を受け取るためにチェックを外す)

使いやすさの理由から、すべての必要な情報を収集するためにはすでにたくさんのページがあるのでインラインで行うことが重要ですスタッフからの情報。

アイデア?

+0

を理由だけで作成することによってそれを解決しない:保存した後、このビューにリダイレクトするchange_viewをオーバーライドし、

def get_urls(self): urls = super(MyModelAdmin, self).get_urls() info = (self.model._meta.app_label, self.model._meta.module_name) my_urls = patterns('', (r'^(?P<object_id>\d+)/notify/$', self.notify_users_view, name='%s_%s_notify' % info) ) return my_urls + urls 

四通知を受信した(または受信しなかった)すべてのユーザーをフィルタリングするユーザーモデルのフィルタ?その後、通知を送信する管理アクションを作成することができます。 –

+0

手順は次のとおりです。指定された劇場演劇と関係があるユーザーをフィルタする。スタッフが、どのリプライズ(イベント)の通知を受け取るのかを指定するようにしてください。それらのすべてが必要ではありません(たとえば、ディレクターはすべてのリプレゼンテーションに出席していません)。この操作は、スタッフがこの特定のイベントに関する他のすべての情報を提出している間に行われます。 – tookanstoken

+0

それははるかに明確になります。では、イベントの多対多をUserにリンクさせることで解決してみませんか?これは、[filter_horizo​​ntal](https://docs.djangoproject.com/ja/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.filter_horizo​​ntal)や[inline](https: //docs.djangoproject.com/ja/dev/ref/contrib/admin/#working-with-many-to-many-models)。これらのユーザーに通知を送信することができます。 –

答えて

0

私はインラインがこのようなものに行く方法だとは思わない。 staff-memberにイベントに関わる電子メールを送信するように指示し、実際にどの通知が通知されるかを制御する必要がある場合は、中間表示を使用する必要があります。

まず、イベントに属するユーザーを選択できるフォームが必要です。最初はusersフィールドをすべてのユーザーに設定しましたが、フォームの__init__メソッドでは、「イベント」kwargを使用してそれに基づいてフィールドをフィルタリングします。

class UserNotifyForm(forms.Form): 
    users = forms.ModelMultipleChoiceField(queryset=User.objects.all(), widget=forms.CheckboxSelectMultiple()) 

    def __init__(self, *args, **kwargs): 
     event = kwargs.pop('event') 
     super(UserNotifyForm, self).__init__(*args, **kwargs) 
     if event: 
      self.fields['users'].queryset = event.users.all() 

第二には、あなただけの通常のフォームビューとして動作することを、あなたのModelAdmin上のビューを作成します。

def notify_users_view(self, request, object_id): 
    event = get_object_or_404(Event, id=object_id) 
    if len(request.POST): 
     form = UserNotifyForm(request.POST, event=event) 
     if form.is_valid(): 
      users = form.cleaned_data.get('users') 
      # send email 
      return HttpResponseRedirect(reverse('admin:yourapp_event_changelist')) 
    else: 
     form = UserNotifyForm(event=event) 

    return render_to_response('path/to/form/template.html', { 
     'event': event, 
     'form': form, 
    }, context_instance=RequestContext(request)) 

あなたはもちろん、このためのテンプレートを作成する必要がありますが、それは簡単です十分な。フォームは既に各ユーザーに1つのチェックボックスのリストを表示するように設定されているため、そこに必要なすべての情報があります。

第三に、あなたのModelAdmin年代のURLには、このビューを結ぶ:

def change_view(self, request, object_id, extra_context=None): 
    response = super(MyModelAdmin, self).change_view(request, object_id, extra_context=extra_context) 
    if len(request.POST): 
     info = (self.model._meta.app_label, self.model._meta.module_name) 
     response['Location'] = reverse('admin:%s_%s_notify', args=(object_id,)) 
    # Note: this will effectively negate the 'Save and Continue' and 
    # 'Save and Add Another' buttons. You can conditionally check 
    # for these based on the keys they add to request.POST and branch 
    # accordingly to some other behavior you desire. 
    return response 
+0

ありがとうございます、私はあなたの答えのほとんどを取得しようとしていますが、間違いなく私はそれを 'When'モデルとともに1ページに入れなければなりません。さもなければ、それは混乱になり、ユーザビリティの災害をもたらすでしょう。最終的に、彼らはそれを使用しませんでした。そして、私はそれが可能だと信じて、私は必要なすべての情報を持って、それを一緒に接続する...ジャンゴ方法が失敗した場合、私はjs(私のjsのスキルが吸う場合でも) – tookanstoken

関連する問題