[英]Unable to autopopulate a Django admin field using an attribute from a OneToOne relationship
對此有類似的問題,但我相信我的不同。 我是Django和Python的新手,所以請原諒我的無知。
我有一個繼承自django.contrib.auth.models User類的自定義類UserProfile。 這個UserProfile基於Tango與Django的練習,但是,我使用這個例子來創建一個不同的項目/應用程序。
我將UserProfile鏈接到我的models.py中具有OneToOneField關系的標准用戶模型,如下所示:
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自動填充。 我希望它根據User的username屬性自動填充。 但是,我似乎無法使其發揮作用。 這是我的admin.py代碼:
class UserProfileAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("user.username",)}
當我嘗試從命令行運行server時,出現以下錯誤:
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中以這種方式訪問它。 關於如何使這項工作的任何想法?
不幸的是, prepopulated_fields
不接受DateTimeField
, ForeignKey
和ManyToManyField
字段。
資料來源: https : //docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.prepopulated_fields
您的models.py中可能的解決方案(make 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.