【问题标题】:Unable to autopopulate a Django admin field using an attribute from a OneToOne relationship无法使用 OneToOne 关系中的属性自动填充 Django 管理字段
【发布时间】:2015-03-06 00:16:08
【问题描述】:

有类似的问题,但我相信我的问题不同。我对 Django 和 Python 很陌生,所以请原谅我的无知。

我有一个继承自 django.contrib.auth.models 用户类的自定义类 UserProfile。此 UserProfile 是基于 Tango with Django 中的练习,但是,我正在使用该示例来创建不同的项目/应用程序。

我在我的models.py中通过OneToOneField关系将UserProfile链接到标准User模型,如下所示:

class UserProfile(models.Model):
    # Links UserProfile to a User model instance.
    user = models.OneToOneField(User)
    # The additional attribute I wish to include that isn't in User.
    slug = models.SlugField(unique=True)

在我的 admin.py 文件中,我想要一个可以使用的 UserProfile 界面,并且我希望在我输入新的 UserProfile 时自动填充 slugfield。我希望它根据用户的用户名属性自动填充。但是,我似乎无法让它工作。这是我的 admin.py 代码:

class UserProfileAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("user.username",)}

当我尝试从命令行运行服务器时,出现以下错误:

ERRORS: <class 'climbcast.admin.UserProfileAdmin'>: (admin.E030) The
value of >'prepopula ted_fields["slug"][0]' refers to 'user.username',
which is not an attribute of >' climbcast.UserProfile'.

System check identified 1 issue (0 silenced).

它不允许我以这种方式访问​​ user.username 属性,即使我可以在 python shell 中以这种方式访问​​它。关于如何完成这项工作的任何想法?

【问题讨论】:

    标签: python django


    【解决方案1】:

    很遗憾,prepopulated_fields 不接受 DateTimeFieldForeignKeyManyToManyField 字段。

    来源:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields

    可能的解决方案,在您的 models.py 中(使 slug 属性可选):

    from django.utils.encoding import force_text
    from django.template.defaultfilters import slugify
    
    
    class UserProfile(models.Model):
        [...]
        slug = models.SlugField(blank=True, db_index=True, unique=True)
    
        def get_unique_slug(self, value):
            """
            Generate a valid slug for a for given string.
            """
            qs = self.__class__.objects.all()
            used = qs.values_list('slug', flat=True)
            i = 1
            baseslug = slugify(value)
            while slug in used:
                slug = '%s-%s' % (baseslug, i)
                i += 1
            return slug
    
        def save(self, *args, **kwargs):
            if not self.slug and self.user:
              self.slug = self.get_unique_slug(force_text(self.user.username))
            super(UserProfile, self).save(*args, **kwargs)
    

    【讨论】:

    • 谢谢。这确实有效,我非常感谢您的帮助。事实证明,尽管我的 slug 字段没有在我眼前自动填充,但它确实在 save() 上起作用。我可以忍受这一点。谢谢!
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多