【问题标题】:custom ordering to django model自定义订购到 django 模型
【发布时间】:2017-08-13 05:17:46
【问题描述】:
class MemberAdmin(CustomUserAdmin, admin.ModelAdmin):
    redirect_model_name = 'memberaccountproxy'
    change_form_template = 'loginas/change_form.html'
    list_display = ('username', 'email', 'first_name', 'last_name','country', 'gender',
                    'created_at', 'profile_pic')
    search_fields = ('username', 'first_name', 'last_name', 'email',)
    add_form = AccountProfileForm
    list_filter = (
        'gender', 'incomplete', 'email_verified', 'suspended',
        'deleted',
    )        
    # profile1 = None

    def get_queryset(self, objects):
        return Account.objects.filter(usertype=1)

    def country(self, obj):
        profile1 = Profile.objects.get(account=obj)
        if profile1.country:
            return profile1.country
        return ''
    country.admin_order_field = 'country'

我想要实现的是让会员列表页面上的国家/地区列可排序。(目前不是)

问题是我从方法 country 中获取“obj”作为 Account 对象(在 get_queryset() 中定义),然后我使用该 obj 获取另一个 Profile 类型的对象(其中有一个成员变量国家)。但是当我尝试将country方法注册到'admin_order_field'时,它只能获取obj的成员变量(Account类型,其中没有country变量)。

有没有一种方法可以根据 Profile 类中的字段而不是 Account 对国家/地区列进行排序。

class Profile(models.Model):
    account = models.OneToOneField(Account)
    country = models.ForeignKey('Country', null=True, blank=True, verbose_name='Country Living In', related_name='+')
    # name = models.CharField(max_length=40, blank=True)
    status = models.ForeignKey('Status', blank=True, null=True, verbose_name='Marital Status', related_name='+')
    btype = models.ForeignKey('Btype', blank=True, null=True, verbose_name='Body type', related_name='+')
    bheight = models.IntegerField(choices=HEIGHT, blank=True, null=True, verbose_name='Height')
    phystatus = models.ForeignKey('EthnicOrigin', blank=True, null=True, verbose_name='Ethnic Origin', related_name='+')
    createdby = models.ForeignKey('CreatedBy', blank=True, null=True, verbose_name='Profile Created By',
                                  related_name='+')
...........................


class Account(AbstractBaseUser):
    email = models.EmailField(unique=True)
    usertype = models.IntegerField(default=1, choices=USER)
    username = models.CharField(max_length=40, unique=True)
    gender = models.CharField(choices=(('Male', 'Male'), ('Female', 'Female')), max_length=10, blank=True)
    phone = models.CharField(max_length=16, blank=True, verbose_name="Mobile No", null=True)


    temple = models.ManyToManyField('Account', blank=True, null=True, verbose_name="MatchMaker")
    first_name = models.CharField(max_length=40, blank=True, null=True)
    last_name = models.CharField(max_length=40, blank=True, null=True)
    acc_for = models.ForeignKey('CreatedBy', blank=True, null=True, verbose_name="Profile Created For")
    country_code = models.ForeignKey('CountryCode', max_length=40, blank=True, null=True)
............................................

【问题讨论】:

    标签: python django python-2.7 django-models django-admin


    【解决方案1】:

    list_displayadmin_order_field 选项支持使用双下划线表示法来访问相关模型。

    你的问题不清楚,因为你没有展示你的模型,但看起来你可以做到:

    country.admin_order_field = 'profile__country'
    

    但是,您可以在 list_display 方法中将 country 替换为 profile__country,并完全删除您的 country 方法。

    【讨论】:

    • 我不知道为什么这对你不起作用。希望你能解决问题。
    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 2021-01-06
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    相关资源
    最近更新 更多