django admin中的对象为外键:

时间:2018-06-14 19:35:49

标签: django python-3.x

我的django模型中有这个对象:

class Stock(models.Model):
    name =  models.CharField(null=True,blank=True,max_length=20)
    def ___str__(self):
        return self.name
    def __unicode__(self):
        return self.name

当我在django admin中看到它时效果很好。

但是当我想看到这个对象时,在管理员中:

class StockData(models.Model):
    stock = models.ForeignKey(Stock,on_delete=models.PROTECT,null=True,blank=True)
    date = models.DateTimeField(null=True,blank=True)
    interval = models.CharField(null=True, blank=True,max_length=2)

    def ___str__(self):
        return self.stock+ ":" + str(self.date)
    def __unicode__(self):
        return self.stock + ":" + str(self.date)

使用此管理员:

from django.contrib import admin
from .models import StockData

# Register your models here.
class StockData_Admin(admin.ModelAdmin):
    list_display = (
        'date',
        'stock',
        'interval'
    )

admin.site.register(StockData,StockData_Admin)

但在管理页面中,stock对象表示为:

Stock object (1)

编辑:

enter image description here

那么如何解决这个问题?

我的django版本:

>>> import django
>>> django.VERSION 
(2, 0, 0, 'final', 0)

谢谢和问候

2 个答案:

答案 0 :(得分:6)

你的con.commit() except pymysql.Error as e: raise sys.exit(1) finally: if con: con.close() 定义中有一个拼写错误 - Python的魔术方法以双下划线开始和结束,Stock' str 目前以三个下划线而不是两个下划线开始。打印Stock实例后,它会回退到Stock default str implementation。删除了多余的下划线后,您会看到models.Model正确显示:

Fixed admin dashboad

答案 1 :(得分:0)

在models.py中尝试这样的事情(未经测试)

<table>

  <tbody>
    <tr>
      <td rowspan="2">Outlet 1</td>
      <td>BBZ</td>
      <td>3</td>
    </tr>
    <tr>
      <td>Regular</td>
      <td>2</td>
    </tr>
    
  </tbody>
</table>
在admin.py中

试试这个

class Stock(models.Model):

  name =  models.CharField(blank=True,max_length=20)
  # charfield default value is empty string so null true not needed

  def __str__(self):
    title = 'Empty title'
    if self.name != '':
        title = self.name
    return title

  def __unicode__(self):
    title = 'Empty title'
    if self.name != '':
        title = self.name
    return title

class StockData(models.Model):
   stock = models.ForeignKey(Stock,on_delete=models.PROTECT,null=True,blank=True)
   date = models.DateTimeField(null=True,blank=True)
   interval = models.CharField(blank=True,max_length=2)

   def __str__(self):
      title = 'Empty title'
      if(all([self.stock, self.date])):
         title = '{}:{}'.format(self.stock, self.date)
      return title

   def __unicode__(self):
     title = ''
     if self.stock and self.date:
        title = self.stock + ':' + self.date
     return title