简体   繁体   中英

Django Admin Adding data

I am trying to learn Django through Coding for Entrepreneur. The problem is in the tutorial, when the tutor adds the models in the admin.py, the values of the fields are shown. While I do it, it shows "something object" only.

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)

How it should be 在此处输入图片说明 How it is happening when I am doing it 在此处输入图片说明 How can I solve this problem.

Thank you for the help

The above shown page should come when clicked on Add join friends. It is shown perfectly in the following page when I add the following code as well in admin.py

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


admin.site.register(JoinFriends, FriendAdmin)

在此处输入图片说明 However, when I click on Add join friends, the page is as shown above in figure1.

在此处输入图片说明

When using def __str___(self) function:

I'm guessing that you're using python 3. In python 3, __str__ is used instead of __unicode__ .

See https://docs.djangoproject.com/en/1.7/topics/python3/#str-and-unicode-methods for more information.

This works. When using Python 3, add

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

and remove list_display from admin.py's class

Appreciated the help. Thanks

As mentioned, Python 3 expects __str__ whereas Python 2 expects __unicode__ .

Calling the object in Admin without a __str__ method results in the generic Join object being displayed in admin. Anything you define in the __str__ method will be displayed, instead.

Further, when in Py3, you should not use a call to __unicode__ in your list_display , since it won't know what you're talking about. I'm guessing using the imports you supplied in your own answer allows this to function properly, but moving forward, you should simply use __str__ where you would otherwise use __unicode__ .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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