繁体   English   中英

为什么 django admin 没有读取 __str__ 方法?

[英]Why django admin is not reading the __str__ method?

我试图在我的 models.py 文件中添加一个str方法到我的管理页面,向我展示我用自己的名字注册的对象,而不是像 'UserObject(1)'

但是当我添加这个方法时,发生了什么:

/admin/crud_app/user/ 'User' 处的 AttributeError object 没有属性 'first_name'

模型.py ->

from django.db import models


class User(models.Model):
    """
    A normal class that represents an User object, the attributes are those bellow:
    """
    first_name = models.CharField(name="First Name", max_length=30)
    last_name = models.CharField(name="Last Name", max_length=30)
    cpf = models.CharField(name="CPF", max_length=30)
    age = models.IntegerField(name="Age")
    email = models.EmailField(name="email", max_length=30)

    def __str__(self):
        return self.first_name
    

管理员.py ->

from django.contrib import admin
from .models import User

admin.site.register(User)

我尝试添加str方法,我希望收到我给 object 注册的名称,而不是“Name object(1)”

您应该在f-strings中定义它以处理 None 值,这样如果它是 None 就不会引发错误。

class User(models.Model):
    """
    A normal class that represents an User object, the attributes are those bellow:
    """
    first_name = models.CharField(name="First Name", max_length=30)
    last_name = models.CharField(name="Last Name", max_length=30)
    cpf = models.CharField(name="CPF", max_length=30)
    age = models.IntegerField(name="Age")
    email = models.EmailField(name="email", max_length=30)

    def __str__(self):
        return f"{self.first_name}"

还可以通过ctrl+f5硬刷新并使用python manage.py runserver 5000在另一个端口重新启动服务器。

编辑

查看您的 GitHub 回购协议后,我发现问题在于将 model 命名为User ,它是 Django 中的内置 model 中的django.contrib.auth所以请将其更改为CustomUser并且问题出现在字段first_namelast_name中这些也在User model 中,所以请尝试以下 model:

from django.db import models


class CustomUser(models.Model):
    """
    A normal class that represents a User object, the attributes are those bellow:
    """
    f_name = models.CharField(
        verbose_name="First Name", max_length=30, default="Test")
    l_name = models.CharField(
        verbose_name="Last Name", max_length=30, default='Test')
    cpf = models.CharField(verbose_name="CPF", max_length=15)
    age = models.IntegerField(verbose_name="Age")
    email = models.EmailField(verbose_name="email", max_length=30)

    def __str__(self):
        return f"{self.f_name}"

然后运行两个迁移命令(makemigrations 和 migrate)。

管理员.py

from django.contrib import admin
from .models import CustomUser


@admin.register(CustomUser)
class CustomUserAdmin(admin.ModelAdmin):
    list_display = ['id', 'f_name', 'l_name', 'cpf', 'age', 'email']

网址.py

from django.urls import path
from crud_app.views import update_user, check_user, delete_user, register_user, menu

urlpatterns = [
    path('', menu),
    path("check_user/", check_user, name="check_user.html"),
    path("register_user/", register_user, name="register_user.html"),
    path("update_user/", update_user, name="update_user.html"),
    path("delete_user/", delete_user, name="delete_user.html")
]

然后您可以自己更改模板中的字段名称。

您需要像这样更正 verbose_name 而不是 model 字段的名称。

class User(models.Model):
    """
    A normal class that represents an User object, the attributes are those bellow:
    """
    first_name = models.CharField(verbose_name="First Name", max_length=30)
    last_name = models.CharField(verbose_name="Last Name", max_length=30)
    cpf = models.CharField(verbose_name="CPF", max_length=30)
    age = models.IntegerField(verbose_name="Age")
    email = models.EmailField(verbose_name="email", max_length=30)

    def __str__(self):
        return self.first_name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM