python - Django:管理界面中的 OneToOne 下拉菜单和独特的关联

标签 python django django-forms django-admin

引用Django - one-to-one modelAdmin我仍在寻找 Django 管理界面和 OneToOne 关系问题的解决方案。

我有以下模型,它使用附加属性 is_thing_staff 扩展了标准用户模型:

class ThingStaff(models.Model):
    """ Extends the django user model by a separate model relationship which holds additional user
    attributes
    """
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # by default a new user is not a staff member which take care of the thing administration
    is_thing_staff = models.BooleanField(default=False)

    def __str__(self):
        return u"{}".format(self.user.username)

    class Meta:
        verbose_name = "Thing Staff"
        verbose_name_plural = "Thing Staff"

如果我在 django 管理界面中创建一个新的 ThingStaff 对象,我可以选择所有用户,即使已经存在用户关系。保存与用户重复关联的新对象会导致错误,即已经存在与该用户关联的 ThingStaff 对象。到目前为止,这或多或少是可以的。

但是,如果可能的选择会导致下一步出现错误,为什么要显示这些选择呢?所以我通过排除它们

from django import forms
from django.contrib import admin
from .models import ThingStaff

class ThingStaffForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ThingStaffForm, self).__init__(*args, **kwargs)
        self.fields['user'].queryset = User.objects.exclude(
           id__in=ThingStaff.objects.values_list('user_id', flat=True)
        )

@admin.register(ThingStaff)
class ThingStaffAdmin(admin.ModelAdmin):
    form = ThingStaffForm

到目前为止,效果很好:在创建新的 ThingStaff 对象期间,已关联的用户不会显示在下拉列表中。

但如果我想更改现有关联,相关用户也不会显示在下拉列表中,这使得无法重置 is_thing_staff 标志。

所以我的问题是:如何在 django 管理界面中再次启用该特定用户的更改 View ?

最佳答案

Django 的 ModelForm 区分添加 View 和更改 View (每个 View 都有自己的方法)。这意味着您可以覆盖它:

class ThingStaffAdmin(ModelAdmin):
     def add_view(self, *args, **kwargs):
         self.form = ThingStaffAddForm
         return super().add_view(*args, **kwargs)

     def change_view(self, *args, **kwargs):
         self.form = ThingStaffChangeForm
         return super().change_view(*args, **kwargs)

文档中的更多内容:

https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.change_view

关于python - Django:管理界面中的 OneToOne 下拉菜单和独特的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50942003/

相关文章:

python - 使用 MQL5 将 OHLC 值从 Python API 集成到 MT5

python - Gunicorn 和 django 设置模块

python - 使用 django-celery 进行单元测试?

python - Django 填充下拉菜单,包含多对多数据库的选择

python - 如何在没有gil(nogil)的情况下在cython cdef中返回两个值

python - Altair 并排分组条形图而不是单个图表

python - 如何在Python中通过Flask传递内存中的Azure Blob

python - 如何让某些东西出现在 Django 的每个页面上?

python - 在django中保存多个上传的文件

python - Django 1.9 FormView永远无法到达get_context_data