如何在Django Admin中显示字段中的多个对象

时间:2018-07-27 18:57:59

标签: python django django-models

我对如何在Django Admin中添加多个access_token和items_ids感到有些困惑。涉及的模型和应用程序如下。这是我的第一篇文章,如果格式不正确,请原谅。

Trans / models.py

Exchange类(models.Model):

created = models.DateTimeField()
owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='token', on_delete=models.CASCADE)
access_token = models.CharField(max_length=300, blank=True, default='')
item_id = models.CharField(max_length=300, blank=True, default='')
request_id = models.CharField(max_length=300, blank=True, default='')

class Meta:
    ordering = ('item_id',)

我已经为管理员设置了一个用户个人资料部分:

Users / models.py

类UserProfile(models.Model):

user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True, verbose_name='user', related_name='profile', on_delete=models.CASCADE)   
avatar_url = models.CharField(max_length=256, blank=True, null=True)
dob = models.DateField(verbose_name="dob", blank=True, null=True)
public_token = models.CharField(max_length=100, blank=True, null=True, verbose_name='public_token')
access_token = models.CharField(max_length=100, blank=True, null=True, verbose_name='access_token')
item_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='item_ID')
just_signed_up = models.BooleanField(default=True)    

def __str__(self):
    return force_text(self.user)

class Meta():
    db_table = 'user_profile'

users / forms.py

UserProfileForm(forms.ModelForm)类:

class Meta:
    model = UserProfile
    fields = ('user', 'public_token', 'access_token', 'item_id',)

users / admin.py

UserProfileAdmin(admin.ModelAdmin)类:

search_fields = ('user', 'dob', 'public_token', 'access_token', 'item_id',)
ordering = ('user',)
list_select_related = ('user',)

admin.site.register(UserProfile,UserProfileAdmin)

UserProfileAdminInline(admin.TabularInline)类:

model = UserProfile

我真的很沮丧,因为我尝试了很多领域,但是似乎无法正确链接,或者在沙盒环境中进行测试时过程中断了。任何帮助将不胜感激!就我而言,我需要为每个用户记录多个access_tokens和item_id。

1 个答案:

答案 0 :(得分:1)

这有点让您感到困惑...尤其是您的数据模型的设置方式....但是我将在回答中做出一些假设(这将有助于更好地理解您正在试图做的高水平的事情。

思考您想要做的是能够为每个用户配置文件配置多个Exchange对象...在这种情况下,我将通过以下方式进行设置: 1.交换模型中用户个人资料上FK上的related_name字段将是您访问多个交易所的方式...因此,在这种情况下,您可能需要一个复数名称。 2.为了能够在Django Admin中编辑多个,您将需要设置一个InlineAdmin对象。 3.实际上位于UserProfile上的CharField只能是单个字段...如果要多个,则需要将它们移动到另一个相关对象(例如Exchange模型)。 4.我不认为您想要的是ManyToMany,因为这意味着用户将共享这些令牌和项目ID(或Exchange?)...但是也许正是您想要的...在这种情况下,您应该将ForeignKey模型的UserProfile更改为ExchangeManyToManyField。这篇文章的其余部分假定您不想要那样。

trans / models.py

from django.db import models
from django.conf import settings


class Exchange(models.Model):

    class Meta:
        ordering = ('item_id', )

    created = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='exchanges', on_delete=models.CASCADE)
    access_token = models.CharField(max_length=300, blank=True)
    item_id = models.CharField(max_length=300, blank=True)
    request_id = models.CharField(max_length=300, blank=True)

users / models.py

from django.db import models
from django.conf import settings


class UserProfile(models.Model):

    class Meta:
        db_table = 'user_profile'

    user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True, verbose_name='user', related_name='profile', on_delete=models.CASCADE)   
    avatar_url = models.CharField(max_length=256, blank=True)
    dob = models.DateField(verbose_name="dob", blank=True, null=True)
    public_token = models.CharField(max_length=100, blank=True, null=True)
    access_token = models.CharField(max_length=100, blank=True, null=True)
    item_id = models.CharField(max_length=100, blank=True, null=True)
    just_signed_up = models.BooleanField(default=True)    

    def __str__(self):
        return force_text(self.user)

users / admin.py

from django.contrib import admin

from trans.models import Exchange
from users.models import UserProfile


class ExchangeAdminInline(admin.TabularInline):

    model = Exchange


class UserProfileAdmin(admin.ModelAdmin):

    inlines = (ExchangeAdminInline, )
    search_fields = ('user', 'dob', 'public_token', 'access_token', 'item_id', )
    ordering = ('user', )
    list_select_related = ('user', )


admin.site.register(UserProfile, UserProfileAdmin)

您可以做很多事情来配置内联以表现您想要的行为...但这就是基础。