Переработан пользовательский профиль StackedInline/TabularInline

StackOverflow https://stackoverflow.com/questions/1390841

Вопрос

Всем привет и спасибо за чтение.

У меня есть простая проблема, от которой я хочу избавиться, и я не видел примеров, когда это еще достигается, хотя поиск по сети довольно долгое время.

Недавно я расширил UserProfile, поэтому мой admin.py выглядит так:

from django.contrib import admin
from django.contrib.auth.models import User
from models import UserProfile
from django.contrib.auth.admin import UserAdmin

admin.site.unregister(User)

class UserProfileInline(admin.StackedInline):
                model = UserProfile

class UserProfileAdmin(UserAdmin):
#               fieldsets = [
#                       (None,  {'fields': ['image']}),
#                       ('Avatar', {'fields': ['text'], 'classes': ['collapse']}),
#               ]
                inlines = (UserProfileInline,)

admin.site.register(User, UserProfileAdmin)

и модели.мне нравится это:

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
        # Required
        user = models.ForeignKey(User, unique=True)
        image = models.ImageField(upload_to='media/users/', blank=True, help_text="Your face")
        text = models.TextField(blank=True, help_text="Write something about yourself")

In an app called users that is referred to by settings.py with:

    AUTH_PROFILE_MODULE = users.UserProfile

1

По сути, чего я хочу добиться, так это избавиться от # 1 StackedInline это отображается в admin.Причина, по которой я использую StackedInline вместо TabularInline, заключается в том, что в противном случае я получаю столбец "Удалить?" справа и я нахожу это необязательным, поэтому я хотел бы либо исключить это, либо избавьтесь от нумерации #1 в StackedInline.

Вот как это выглядит в "реальном мире" ..(Выделено красным)

Сложенный: hxxp://i28.tinypic.com/2lsadkg.jpg

Табличный: hxxp://i27.tinypic.com/4lybs.jpg

2

Также.Интересно, почему я не могу использовать наборы полей, когда я загрузил UserProfile models.py файл в admin.py.Это просто говорит, что поле не существует.Должен ли я вызывать поля иначе, чем в django/ contrib/auth/admin.py где я видел, как это работает?

Если вы чувствуете, что есть более эффективный способ сделать это, просто скажите мне.Я открыт для любых ответов.

Это было полезно?

Решение

1

Я думаю, ты становишься здесь слишком придирчивым.Если вам абсолютно необходим контроль над такими мельчайшими деталями, вам следует создавать свои собственные представления вместо использования администратора.В противном случае stacked - это то, что вам нужно, потому что tabular не имеет особого смысла для отношений "один к одному".

2

Я смог использовать наборы полей в профилях пользователей.Единственная разница между моим кодом и вашим, похоже, заключается в том, что я использую tuple вместо dict .Вот мой для сравнения:

class UserProfileInline(admin.StackedInline):
    model = UserProfile

class MyUserAdmin(UserAdmin):
    inlines = [UserProfileInline]
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
        (_('Groups'), {'fields': ('groups',)}),
    )
    exclude = ['user_permissions']

Редактировать:

Я только что сделал быструю проверку, и "# 1" исходит из шаблона администратора.

Это означает, что вы можете легко удалить его, переопределив стандартный шаблон администратора, хотя это повлияет на все ваши встроенные строки, включая те, которые относятся один ко многим.

Встроенный шаблон stacked можно найти в django/contrib/admin/templates/admin/edit_inline/stacked.html

Это означает, что вы можете скопировать шаблон в свой собственный каталог templates как templates/admin/edit_inline/stacked.html и это будет загружено Django во время выполнения вместо стандартного шаблона.

После копирования отредактируйте свою локальную копию, чтобы удалить #{{ forloop.counter }} в строке 9.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top