Mam kilka modeli mających użytkownika jako klucz obcy. Lista użytkowników wyświetla nazwę użytkownika, ale chcę ją dostosować. Czy muszę przedłużyć model użytkownika za pomocą niestandardowego modelu i napisać własną funkcję __str__
? Czy istnieje prostszy sposób? Nie sądzę, że można użyć wywołania dla zestawu pól, prawda?Jak zmienić reprezentację użytkownika w Django Admin, gdy jest używany jako klucz obcy?
Odpowiedz
Można zmienić ciąg znaków reprezentujący domyślnego użytkownika Django, zastępując metodę User __unicode__
. Dodaj poniższy kod gdzieś w swojej aplikacji, być może w models.py
def custom_user_display(self):
return self.email + ', ' self.first_name # write your representation here
User.add_to_class("__unicode__", custom_user_display) # override the __unicode__ method
Załóżmy masz model podobny do tego
class UserProfile(models.Model):
user = models.OneToOneField(User, unique=True, verbose_name=_('user'), related_name='profile')
city = models.CharField(max_length=128, null=True, blank=True)
I chcesz pokazać e-mail użytkownika zamiast nazwy użytkownika lub identyfikatora użytkownika admin strona, można zrobić coś takiego
class UserProfileAdmin(admin.ModelAdmin):
list_display = ('get_user', 'city')
def get_user(self, obj):
return obj.user.email
get_user.short_description = 'User'
get_user.admin_order_field = 'user__id'
Pytanie dotyczy pytania o to, jak pole Użytkownik wygląda na innych obiektach, gdy Użytkownik jest obcym kluczem. Spowoduje to jedynie zmianę reprezentacji na stronie UserProfile. – jastr
ForeignKeys
formularzy Django są reprezentowane przez ModelChoiceFields
. Klasa ModelChoiceField
ma metodę label_from_instance
, która decyduje o renderowaniu wyboru. Aby zmienić tę reprezentację w panelu administracyjnym, musisz zmodyfikować to pole formularza.
Oto prosty przykład.
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
field = super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
if db_field.name == "user":
field.label_from_instance = lambda u: "My Object #%i" % u.id
return field
Jest to dobre rozwiązanie, ale wymaga zdefiniowania niestandardowego modelu administratora dla każdego modelu. – jastr
myślę __unicode__()
metoda nie jest prawidłowe, należy użyć __str__()
metody.
Dla Python 2.x
, __str__()
metoda zwróci str (bajty) i __unicode__()
metoda zwróci unicode (tekst).
Instrukcja print i STR wbudowaną rozmowy
__str__()
celu ustalenia z czytelną reprezentację obiektu. Wbudowany unicode dzwoni__unicode__()
, jeśli istnieje, i w inny sposób wraca do__str__()
i dekoduje wynik z kodowaniem systemowym. Odwrotnie, klasa bazowa modelu automatycznie uzyskuje__str__()
z__unicode__()
przez kodowanie do UTF-8. read here complete
Ale w Python 3.x
jest tylko __str__()
nie __unicode__()
metoda.
Django zapewnia prosty sposób definiowania
__str__()
i__unicode__()
sposoby, które działają na Python 2 i 3: należy zdefiniować__str__()
metoda przekazujących tekst i zastosować python_2_unicode_compatible() dekorator.W języku Python 3 dekorator nie jest dostępny. W języku Python 2 definiuje on metody odpowiednie
__unicode__()
i__str__()
(zastępując oryginalną metodę__str__()
).
Oto przykład z dokumentacji Django.
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible
class MyClass(object):
def __str__(self):
return "Instance of my class"
ROZWIĄZANIE: ozdobić w taki sam sposób, jak odbywa się powyżej swojej klasy i w models.py
, dodać metodę, które zostaną dodane do modelu użytkownika.
from django.contrib.auth.models import User
def get_name(self):
return '{} {}'.format(self.first_name, self.last_name)
User.add_to_class("__str__", get_name)
Klasa użytkownika Django ma ten dekorator, więc przy ładowaniu '__unicode__' jest ustawiona na' __str__ '. Dlatego wygląda na to, że będziemy musieli przesłonić '__unicode__' – jastr
W rzeczywistości nie ma potrzeby przesłonięcia metody __unicode__, aby zapobiec nadpisywaniu używamy' add_to_class' – Surajano
- 1. Jak zmienić klucz obcy?
- 2. jak sprawdzić, czy klucz rekordu jest używany w innych tabelach jako klucz obcy (sql)?
- 3. Admin Django queryset filtrowania przez klucz obcy wstecznej relacji
- 4. Jak utworzyć klucz obcy do tabeli użytkownika w Django?
- 5. Klucz obcy Django Model
- 6. klucz Composite jako klucz obcy (SQL)
- 7. Jak utworzyć użytkownika admin w django tests.py
- 8. wartość Klucz obcy w Django REST ramowa
- 9. Zmiana MySQL klucz podstawowy, gdy istnieje klucz obcy contraints
- 10. Model Django - wybory kontra klucz obcy?
- 11. Upuść klucz obcy tylko wtedy, gdy istnieje
- 12. Dlaczego hasło użytkownika nie jest hashed w django admin?
- 13. Jak obsłużyć klucz obcy w FactoryGirl
- 14. Django - dostęp do Menedżera klucz obcy w django z szablonów
- 15. Ogólny klucz obcy sqlalchemy (jak w ORM django)
- 16. Czy klucz obcy może działać jako klucz podstawowy?
- 17. Django: Sprawdź, czy atrybut klucz obcy jest ustawiona
- 18. Modyfikuj klucz obcy w Ecto
- 19. Jak utworzyć klucz obcy w phpmyadmin
- 20. W Django Admin obejmują auth.User jako inline
- 21. Django Admin nie Hashing klienta użytkownika Hasło
- 22. Klucz obcy SQLite?
- 23. Jak zmienić klucz obcy MySQL za pomocą wiersza polecenia
- 24. admin django sortuj listę pól obcych
- 25. jak zapisać klucz obcy w JPA
- 26. Rails 4.2 klucz obcy
- 27. Wielokolumnowy klucz obcy w MySQL?
- 28. Klucz obcy SQLite
- 29. Jak zmienić reprezentację ciągów w klasie Pythona?
- 30. Łączenie tabel, klucz obcy
Możesz użyć niestandardowego administratora, takiego jak @dmitryro. Nie potrzebujesz narzędzi django-admin, aby osiągnąć to, o co prosiłeś. Jeśli chcesz pokazać coś innego niż nazwa użytkownika w innym miejscu, polecam używanie modeli proxy i zastępowanie metody __str__ zamiast tworzenia niestandardowego modelu użytkownika. – xtranophilist
Mogę utworzyć model proxy dla użytkownika, ale chyba muszę go użyć jako klucz obcy dla wszystkich modeli? – vicusbass
Tak, będziesz musiał. – xtranophilist