【问题标题】:Django Admin Adding dataDjango 管理员添加数据
【发布时间】:2015-02-09 14:29:55
【问题描述】:

我正在尝试通过 Coding for Entrepreneur 学习 Django。问题出在教程中,当导师在 admin.py 中添加模型时,会显示字段的值。当我这样做时,它只显示“某物”。

models.py

from django.db import models

class Join(models.Model):
    email = models.EmailField() 
    ref_id = models.CharField(max_length=120, default='ABC', unique=True)
    ip_address = models.CharField(max_length=120, default='ABC')
    timestamp = models.DateTimeField(auto_now_add = True, auto_now = False)
    updated = models.DateTimeField(auto_now_add = False, auto_now = True)   

    def __unicode__(self):
        return "%s" %(self.email)

    class Meta:
        unique_together = ("email", "ref_id",)


class JoinFriends(models.Model):
    email = models.OneToOneField(Join, related_name="Sharer")
    friends = models.ManyToManyField(Join, related_name="Friend", null=True, blank=True)
    emailall = models.ForeignKey(Join, related_name="emailall")

    def __unicode__(self):
        print(self.friends.all())
        print(self.emailall)
        print(self.email)
        return (self.friends.all()[0].email)

admin.py

from django.contrib import admin
from .models import Join, JoinFriends 

class JoinAdmin(admin.ModelAdmin):
    list_display = ['__unicode__', 'timestamp', 'updated']

    class Meta:
        model = Join

admin.site.register(Join, JoinAdmin)
admin.site.register(JoinFriends)

应该如何 我这样做的时候是怎么回事 我该如何解决这个问题。

感谢您的帮助

当点击添加加入好友时,应该会出现上面显示的页面。当我在 admin.py 中添加以下代码时,它在下一页中完美显示

class FriendAdmin(admin.ModelAdmin):
    list_display = ['__unicode__']


admin.site.register(JoinFriends, FriendAdmin)

但是,当我点击添加加入好友时,页面如上图1所示。

使用 def __str___(self) 函数时:

【问题讨论】:

  • 你好,如你所见。主页正在工作。但是我点击添加时的页面没有显示确切的值。相反,它显示了 Join 对象
  • unicode函数中未闭合的双引号是错字吗?
  • 你用的是python 2还是python 3?
  • 如果使用python 3,则需要定义def __str__(self):而不是__unicode__
  • 它正在返回一个字符串。即使我编辑 models.py 并删除 JoinFriends 类并添加friend = models.ForeignKey("self", related_name="referral", null=True, blank=True)

标签: python django admin


【解决方案1】:

我猜你使用的是 python 3。在 python 3 中,__str__ 被使用而不是 __unicode__

更多信息请参见https://docs.djangoproject.com/en/1.7/topics/python3/#str-and-unicode-methods

【讨论】:

  • 当我使用 str 时,它会在我运行服务器时显示在上面
  • list_display 中的FriendAdmin 类中删除__unicode__
  • list_display 和 str 的等价物是什么?
  • 完全删除list_display,默认使用__str__list_display 更适合用于显示分成列的单个字段。它应该包含字段名称,例如list_display = ("email", "name")。另外,如果它帮助您解决了问题,请接受答案。
【解决方案2】:

这行得通。使用 Python 3 时,添加

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible
from django.db import models
@python_2_unicode_compatible

并从 admin.py 的类中删除 list_display

感谢您的帮助。谢谢

【讨论】:

    【解决方案3】:

    如前所述,Python 3 需要 __str__ 而 Python 2 需要 __unicode__

    在没有 __str__ 方法的情况下在 Admin 中调用对象会导致在 admin 中显示通用 Join object。您在 __str__ 方法中定义的任何内容都会被显示出来。

    此外,在 Py3 中,您不应该在您的 list_display 中使用对 __unicode__ 的调用,因为它不会知道您在说什么。我猜使用您在自己的答案中提供的导入可以使其正常运行,但继续前进,您应该简单地使用__str__,否则您将使用__unicode__

    【讨论】:

    • 在主页面上,现在只显示一个字段。如何在 python 3 中显示必要的字段,就像在 python 3 中使用 list_object 一样?
    • 只需将每个字段添加到list_display。这是要在更改列表中显示的模型中的哪些字段或方法的列表。您不能直接显示多对多字段,但其余字段可以。例如,您可以尝试list_display = ['__str__', 'email', 'emailall']
    猜你喜欢
    • 2012-06-14
    • 2015-03-27
    • 1970-01-01
    • 2019-03-13
    • 2012-05-12
    • 2010-10-04
    • 2015-01-06
    • 2013-04-15
    • 2015-09-27
    相关资源
    最近更新 更多