2016-11-20 6 views
0

私はadmin.pyでインラインクラスを作成し、選択したユーザーを更新するいくつかのアクションを作成しました。私が直面している問題は、ユーザーを選択してそのアクションを実行すると、adminユーザーのみが更新されるということです。私はrequestを使用しているため推測しています。私は、アクションを開始する管理ユーザーではなく、選択されたユーザーを更新するアクションを取得しようとしていますが、これを数日後に把握しようとしています。 querysetを使用している場合は、'Queryset' object has no attribute 'profile'というエラーメッセージが表示されますが、ここで何を使用するかはわかりません。だからmu質問は、私が可能にしようとしているものです、もしそうなら、この作業をどのようにするかについての指針は、大いに感謝されるでしょう。以下の私のコードを見てください。Django管理者が選択したユーザーを変更しますか?

admin.py

admin.site.unregister(User) 


class ProfileAdminInLine(admin.StackedInline): 
    model = Profile 


class ProfileAdmin(UserAdmin): 
    list_display = ['username', 'email', 'first_name', 'last_name', 
        'rewards_punch_card', 'rewards_tier'] 
    list_select_related = True 
    inlines = [ProfileAdminInLine] 

    actions = ['pc_add_1', 'pc_add_2', 'pc_add_3', 'pc_add_4', 'pc_add_5', 
       'pc_add_6', 'pc_add_7', 'pc_add_8', 'pc_add_9'] 

    def rewards_tier(self, user): 
     return user.profile.rewards_tier 

    def rewards_punch_card(self, user): 
     return user.profile.rewards_current 

    def pc_add_1(self, request, queryset): 

     punch_card = request.user.profile.rewards_current 
     tier = request.user.profile.rewards_tier 
     credits = request.user.profile.rewards_credits 

     user_profile = request.user.profile 

     punch_cards_updated = punch_card + 1 

     if punch_cards_updated == 10: 
      request.user.profile.rewards_current = 0 
      user_profile.save() 
      if tier == 1: 
       request.user.profile.rewards_tier = tier + 1 
       request.user.profile.rewards_credits = credits + 25 
       user_profile.save() 
      elif tier == 2: 
       request.user.profile.rewards_tier = tier + 1 
       request.user.profile.rewards_credits = credits + 30 
       user_profile.save() 
      elif tier == 3: 
       request.user.profile.rewards_tier = tier + 1 
       request.user.profile.rewards_credits = credits + 35 
       user_profile.save() 
      elif tier == 4: 
       request.user.profile.rewards_tier = tier + 1 
       request.user.profile.rewards_credits = credits + 40 
       user_profile.save() 
      elif tier == 5: 
       request.user.profile.rewards_credits = credits + 50 
       user_profile.save() 
      elif tier == 6: 
       request.user.profile.rewards_credits = credits + 50 
       user_profile.save() 

     else: 
      request.user.profile.rewards_current = punch_card + 1 
      user_profile.save() 

     self.message_user(request, "Users were successfully updated by 1 item.") 
+0

'queryset'が選択されているプロファイルのリストが含まれています管理者:あなたはそれを直接使うべきです。しかし、プロファイルで実際に何をしたいのかははっきりしません。あなたのコードは何も変わりません。 –

+0

この行に示されているように、 'punch_cards_updated = punch_card + 1'は' user.profile.rewards_current'オブジェクトに1つ追加しようとしています。 'queryset'を使用すると、クエリーセットに属性プロファイルが含まれていないという属性エラーが発生します。私が達成しようとしていることの全体像を示すためにコードを更新します。 – Kerosive

+0

結果を保存しますか?このコードが機能したとしても、保存せずには何もしません。 –

答えて

2

私はコメントで述べたように、querysetは、選択されたユーザプロファイルのセットです。だから、あなたはそれを繰り返す必要があります。明らかに、request.userからではなく、ループからのプロファイルも一貫して使用する必要があります。

def pc_add_1(self, request, queryset): 

    for user_profile in queryset: 

     punch_card = user_profile.rewards_current 
     tier = user_profile.rewards_tier 
     credits = user_profile.rewards_credits 

     punch_cards_updated = punch_card + 1 

     if punch_cards_updated == 10: 
      user_profile.rewards_current = 0 
      if tier == 1: 
       user_profile.rewards_tier = tier + 1 
       user_profile.rewards_credits = credits + 25 
     ... 
     user_profile.save() 

(ワンマイナーポイント:あなたがpunch_cards_updatedで何かをやっているようには見えませんが、あなたはuser_profile.rewards_currentにそのバックを設定することを意味しましたか?)

+0

それはうまくいきました、ありがとう! 「punch_cards_updated」までは、パンチカードの価値を調べるために使っています。たとえば、値が '18 'のときに' pc_add_9'に関数があるので、私はパンチカードを8にリセットします。これは、パンチカードが10以上であれば、ロールオーバーしたいのです。 – Kerosive

関連する問題