1

我正在创建一个使用管理面板(以及 django-guardian)的投票应用程序,其中模型之间的相关 ForeignKeys 链是:

Vote =>
Choice (the choice being voted on) =>
Survey (the survey containing the choice) =>
User (the creator of the survey)

期望的行为:

  • 在修改调查的现有投票时,管理员应该只看到来自该特定调查的选项。
  • 添加新投票时,应向管理员显示他们创建的所有调查中的所有选项,格式为“choice.choice_text (survey.question)”。

下面的代码几乎可以让我到达我需要的地方,除了一些事情(按对我的重要性排序):

  1. 显然,temp_creator 需要调用调查的所有者​​,即当前登录的用户(request.user?)。
  2. 编辑个人投票时,我希望选择列表仅限于投票所属的特定调查。
  3. 通过管理面板添加新投票时,我希望所有选项都可见,但我想将survey.question附加到它们,以便用户可以知道他们来自哪个调查,以防调查共享相同的choice_text。

这是我的代码:

# admin.py

class VoteForm(forms.ModelForm):

    temp_creator = User.objects.get(pk=2)
    surveys_owned = Survey.objects.filter(creator=temp_creator)
    choice = forms.ModelChoiceField(queryset=Choice.objects.filter(survey__in=surveys_owned))

    class Meta:
        model = Vote

class VoteAdmin(GuardedModelAdmin):

    fieldsets = [
        ('Required fields', {'fields':['voter_name','choice','rank']}),
    ]

    #these lines are for how it's displayed in the admin panel
    list_display = ('voter_name','user_name','choice','rank','date_modified','date_created')
    list_filter = ['choice','rank','date_modified']
    search_fields = ['choice','voter_name','user_name']

    form = VoteForm

    def queryset(self, request):
        if request.user.is_superuser:
            return super(VoteAdmin, self).queryset(request)
        return get_objects_for_user(user=request.user, perms=['add_vote', 'change_vote', 'delete_vote'], klass=Vote, any_perm=True)

    def save_model(self, request, obj, form, change):
        """When creating a new object, set the creator field.
        """
        if not change:
            obj.user_name = request.user

        obj.save()
4

1 回答 1

0

好吧,我能够部分回答我的问题——通过在我的 VoteAdmin 类中包含这个方便的函数并完全放弃 VoteForm 解决了问题 1:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "choice":
        surveys_owned = Survey.objects.filter(creator=request.user)
        kwargs["queryset"] = Choice.objects.filter(survey=surveys_owned)
    return super(VoteAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

不过,我仍在研究第二个和第三个问题。除非有人在我之前得到它,否则将在这里发布决议。

编辑:最终通过实现嵌套内联来绕过这个问题。无论如何,为后代获得答案会很棒。

于 2014-07-30T21:17:53.903 回答