Zmiana nazwy stworzonego objektu w Panelu Admina

38 views
Skip to first unread message

killerbees1982

unread,
Jan 13, 2017, 11:03:48 AM1/13/17
to django-pl - grupa polskiej społeczności Django
Witam po raz kolejny. Poprzednie problemy udało mi się rozwiązać i dziękuję wam za to. Nie musiałem długo czekać na kolejny problem. Mianowicie chodzi o to, że jak dodaję w PA np. Województwo lub Firmę to zapisuje się bez problemu lecz nadaje nazwę np: 'wojewodztwo object' zamiast np. Mazowieckie tak jak wpisuję w wartości.

Krzysztof Hoffmann

unread,
Jan 13, 2017, 11:10:31 AM1/13/17
to djan...@googlegroups.com
Jakbyś chciał zmienić tylko reprezentacje tego obiektu w modelu klasy wojewodztwo dodajesz metodę:

def __unicode__(self):
 return self.name

gdzie 'name' to pole z obiektu

Ewentualnie, jakbyś wyświetlić konkretne wartość z obiektu to wystarczy: object.name  ( gdzie object to co obecnie wyświetlasz jako 'wojewodztwo object' ) 

Jeśli natomiast na liście obiektów w panelu admina chcesz wyświetlić jakieś pola to: https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

:)

W dniu 13 stycznia 2017 17:03 użytkownik killerbees1982 <killerb...@gmail.com> napisał:
Witam po raz kolejny. Poprzednie problemy udało mi się rozwiązać i dziękuję wam za to. Nie musiałem długo czekać na kolejny problem. Mianowicie chodzi o to, że jak dodaję w PA np. Województwo lub Firmę to zapisuje się bez problemu lecz nadaje nazwę np: 'wojewodztwo object' zamiast np. Mazowieckie tak jak wpisuję w wartości.

--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „django-pl - grupa polskiej społeczności Django” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na django-pl+unsubscribe@googlegroups.com.
Aby opublikować wpis w tej grupie, wyślij e-maila na djan...@googlegroups.com.
Otwórz tę grupę na https://groups.google.com/group/django-pl.
Więcej opcji znajdziesz na https://groups.google.com/d/optout.

Andrzej

unread,
Jan 13, 2017, 11:12:46 AM1/13/17
to django-pl - grupa polskiej społeczności Django
Przejrzyj Tutorial!

utwórz metodī __str__(), która zwróci odpowiedni string w modelu.

W dniu 13 stycznia 2017 17:03 użytkownik killerbees1982 <killerb...@gmail.com> napisał:
Witam po raz kolejny. Poprzednie problemy udało mi się rozwiązać i dziękuję wam za to. Nie musiałem długo czekać na kolejny problem. Mianowicie chodzi o to, że jak dodaję w PA np. Województwo lub Firmę to zapisuje się bez problemu lecz nadaje nazwę np: 'wojewodztwo object' zamiast np. Mazowieckie tak jak wpisuję w wartości.

--

Maciej Gębarski

unread,
Jan 13, 2017, 11:14:13 AM1/13/17
to djan...@googlegroups.com
Pierwszy link z googla 
Witam po raz kolejny. Poprzednie problemy udało mi się rozwiązać i dziękuję wam za to. Nie musiałem długo czekać na kolejny problem. Mianowicie chodzi o to, że jak dodaję w PA np. Województwo lub Firmę to zapisuje się bez problemu lecz nadaje nazwę np: 'wojewodztwo object' zamiast np. Mazowieckie tak jak wpisuję w wartości.

--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „django-pl - grupa polskiej społeczności Django” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na django-pl+...@googlegroups.com.

killerbees1982

unread,
Jan 13, 2017, 11:35:00 AM1/13/17
to django-pl - grupa polskiej społeczności Django
Dzięki za odpowiedzi i stosuje __str__ oraz __unicode__ jednak... nie działa nie wiem  dlaczego.
Pisałem tak:
class wojewodztwo(models.Model):
    nazwa = models.CharField(max_length=70, verbose_name='Województwo')
    class Meta:
        verbose_name='Województwo'
        verbose_name_plural='Województwa'

        def __str__(self):
            return 'wojewodztwo: {}'.format(self.nazwa)
   
        def __unicode__(self):
            return 'wojewodztwo: {}'.format(self.nazwa)

Pisałem także tak:
class wojewodztwo(models.Model):
    nazwa = models.CharField(max_length=70, verbose_name='Województwo')
    class Meta:
        verbose_name='Województwo'
        verbose_name_plural='Województwa'

        def __str__(self):
            return 'wojewodztwo: ' + self.nazwa
   
        def __unicode__(self):
            return 'wojewodztwo: ' + self.nazwa

oraz pisałem tak:

class wojewodztwo(models.Model):
    nazwa = models.CharField(max_length=70, verbose_name='Województwo')
    class Meta:
        verbose_name='Województwo'
        verbose_name_plural='Województwa'

        def __str__(self):
            return self.nazwa
        def __unicode__(self):
            return self.nazwa

No i nic z tego. Korzystam z pythona 2.7 na ububtu jednak powinno to działać bez problemu.

Andrzej

unread,
Jan 13, 2017, 11:42:58 AM1/13/17
to django-pl - grupa polskiej społeczności Django
grrr... __unicode__ i __str__ nie mają być wewnątrz klasy Meta.
poczytaj ten tutorial do diaska...

przy okazji - nazwy klas przyjęło się pisać dużymi literami...

--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „django-pl - grupa polskiej społeczności Django” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na django-pl+unsubscribe@googlegroups.com.

killerbees1982

unread,
Jan 13, 2017, 11:49:50 AM1/13/17
to django-pl - grupa polskiej społeczności Django
Andrzeju nie denerwuj się :) Czytałem trochę tutorial jednak tam takich szczegółów nie ma. Zresztą ja wole się zapytać kogoś kto to dobrze zna.
Jak radziłeś wywaliłem unicode i str z klasy meta i zmieniłem na wielkie litery klasy (tzn. początek) i nadal nic... Niby mały problem a bardzo mnie irytuje

Andrzej

unread,
Jan 13, 2017, 11:52:58 AM1/13/17
to django-pl - grupa polskiej społeczności Django
Przeczytanie "trochę" nie pomoże - warto go ukończyć. Tam też zostaną *opisane* po części podstawy samego Pythona, bo to naprawdę podstawy tego języka.

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):              # __unicode__ on Python 2
        return self.name


W dniu 13 stycznia 2017 17:49 użytkownik killerbees1982 <killerb...@gmail.com> napisał:
Andrzeju nie denerwuj się :) Czytałem trochę tutorial jednak tam takich szczegółów nie ma. Zresztą ja wole się zapytać kogoś kto to dobrze zna.
Jak radziłeś wywaliłem unicode i str z klasy meta i zmieniłem na wielkie litery klasy (tzn. początek) i nadal nic... Niby mały problem a bardzo mnie irytuje

--

killerbees1982

unread,
Jan 13, 2017, 11:57:55 AM1/13/17
to django-pl - grupa polskiej społeczności Django
Jak najbardziej stosuję:

def __unicde__(self):
        return self.nazwa

i nic się nie dzieje... cały czas na liście mam wojewodztwo object

Andrzej

unread,
Jan 13, 2017, 11:59:31 AM1/13/17
to django-pl - grupa polskiej społeczności Django
literówka w słowie unicode

killerbees1982

unread,
Jan 13, 2017, 12:02:02 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Tak wiem bo pisałem teraz odp. z palca nie wklejałem ale chodziło o unicode.

Andrzej

unread,
Jan 13, 2017, 12:04:26 PM1/13/17
to django-pl - grupa polskiej społeczności Django
pokaż cały model teraz

W dniu 13 stycznia 2017 18:02 użytkownik killerbees1982 <killerb...@gmail.com> napisał:
Tak wiem bo pisałem teraz odp. z palca nie wklejałem ale chodziło o unicode.

--

killerbees1982

unread,
Jan 13, 2017, 12:21:21 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Coś zaczyna działać bo  w admin.py dodałem linie:

class FirmaAdmin(admin.ModelAdmin):
    list_display = ('nazwa', 'miasto')
 
oraz

admin.site.register(Firma, FirmaAdmin)


Zapisuje niby ok bo jak wejdę w PA do Firmy->Firmy to jest zapisane ok.
Jednakże w panelu głównym PA ("Ostatnie działania") nadal jest wpis Firma object.

Jak próbowałem zrobić to dla klasy Wojewodztwa to w terminalu wywala mi błąd:

SystemCheckError: System check identified some issues:

ERRORS:
<class 'firmy.admin.WojewodztwoAdmin'>: (admin.E107) The value of 'list_display' must be a list or tuple.

Rozumiem że muszą być przynajmniej dwie wartości list_display dla klasy WojewodztwoAdmin jednak ja potrzebuje tylko jednego elementu mianowicie "Województwo".




killerbees1982

unread,
Jan 13, 2017, 12:35:44 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Poradziłem sobie z Wojewodztwami zapomniałem dodać przecinka po list_display('nazwa',).
Jednak w menu głównym PA nadal w ostatnich działaniach mam Wojewodztwo object lub Firma object.
Tak samo jak wejdę  dodawanie firmy i zastosowałem tam ManyToManyField do wyboru wojewodztwa i tam tez jest "Wojewodztwo object"

Bartłomiej Opajdowski

unread,
Jan 13, 2017, 12:45:12 PM1/13/17
to djan...@googlegroups.com
kluczem są wcięcia w modelu. sprawdź z tutorialem czy masz wcięcia prawidłowo. Znak po znaku

--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „django-pl - grupa polskiej społeczności Django” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na django-pl+unsubscribe@googlegroups.com.
Aby opublikować wpis w tej grupie, wyślij e-maila na djan...@googlegroups.com.
Otwórz tę grupę na https://groups.google.com/group/django-pl.
Więcej opcji znajdziesz na https://groups.google.com/d/optout.



--
pozdrawiam
Bartłomiej Opajdowski

killerbees1982

unread,
Jan 13, 2017, 12:59:14 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Bartek wydaje mi się że wszystko jest ok inaczej pewnie zwróciłby się jakiś błąd.

Marcin Kallas

unread,
Jan 13, 2017, 12:59:33 PM1/13/17
to django-pl - grupa polskiej społeczności Django
ManyToManyField? Chcesz przypisać wiele województw do jednej firmy? Tak ogólnie pytam bo po kolejnych twoich wpisach wnioskowałem, że robisz jakiś katalog firm i nie wiem czy nie łatwiej by ci było zapisać dane w pojedynczej tabeli zamiast łączyć bez wiele tabel. Wybór województwa można zrobić w formie wyboru z listy i zapisanie w tym samym rekordzie zamiast pobierać z innej tabeli. Ale jeśli już robisz wykaz województw w osobnej tabeli to chyba lepiej użyć ForeignKey, bo jeśli tak jak przypuszczam to ma być jakaś baza z danymi firm to raczej jeden adres do jednej firmy, a nie kilka województw. Ale jeśli moje przypuszczenie jest błędne to nie ma tematu.

Pozdrawiam

killerbees1982

unread,
Jan 13, 2017, 1:03:45 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Marcin jak najbardziej masz rację. Uczę się i postawiłem sobie za zadania stworzenie witryny a'la katalog firm. Muszę poczytać o foreign_key bo najwidoczniej źle zinterpretowałem ManyToMany.

Marcin Kallas

unread,
Jan 13, 2017, 1:39:13 PM1/13/17
to django-pl - grupa polskiej społeczności Django
"wiele do wielu" oznacza, że każda z pozycji w jednej tabeli może mieć przypisane wiele pozycji drugiej tabeli, a przy katalogu firm raczej nie chcesz przypisywać wielu województw do jednego rekordu więc jeśli już to "klucz obcy" tabeli z województwami. Ale jeśli już chodzi o rozwiązanie to województwa raczej są stałe więc moim zdaniem lepiej zrobić po prostu pole wyboru:

przykład:

WOJEWODZTWA = (('skrót_województwa', 'nazwa_województwa'), ('inny_skrót_województwa', 'inna_nazwa_województwa'), ...)
wojewodztwa = models.CharField(max_length=2, choices=WOJEWODZTWA, blank=True, verbose_name='województwo')

Objaśnienie:
najpierw masz do stałej przypisaną tuple gdzie każdy z jej elementów jest tuplą złożoną z dwóch elementów - skrótu i nazwy. Następnie masz definiowaną zmienną (pozycje w tabeli). Jest ona typu znakowego. max_length to ogranicznik ilości znaków. Ustawiłem na dwa bo założyłem, że skróty będą dwuznakowe. Kolejny parametr choices wskazuje wcześniej zdefiniowaną stałą. blank=True oznacza, że pole może być puste. Na temat blank i null miałeś wcześniej wyjaśnione. verbose_name to wyświetlana nazwa pozycji w tabeli. Efekt tego kodu jest taki, że do pozycji po wybraniu będzie przypisany skrót, ale na liście wyboru będzie widoczna druga pozycja tupli czyli nazwa województwa.

Oczywiście zrobienie wykazu województw w osobnej tabeli nie jest wielkim błędem ale np. jak będziesz chciał zrobić wykaz osób to prościej jest napisać dwie linijki kodu niż np. budować model dla dwóch rekordów określających płeć.


W dniu piątek, 13 stycznia 2017 19:03:45 UTC+1 użytkownik killerbees1982 napisał:

killerbees1982

unread,
Jan 13, 2017, 1:51:12 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Marcin wielkie dzięki za wytłumaczenie :)
Nadal borykam się z tą listą w głównym menu PA, bo po dodaniu nowego rekord wciąż mam np.Firma object itd., gdzie firmy normalnie zapisuje.

Może jak ktoś rzuci okiem na kod to powie mi co źle robię?

admin.py

Tutaj wprowafrom django.contrib import admin

from firmy.models import *



class FirmaAdmin(admin.ModelAdmin):
    list_display
= ('nazwa', 'miasto')

    prepopulated_fields
= {'slug': ('nazwa',)}

class WojewodztwoAdmin(admin.ModelAdmin):
    list_display
= ('nazwa',)

class BranzaAdmin(admin.ModelAdmin):
    list_display
= ('profil',)

admin
.site.register(Wojewodztwo, WojewodztwoAdmin)
admin
.site.register(Firma, FirmaAdmin)
admin
.site.register(Branza, BranzaAdmin)dź kod...

models.py

# -*- coding:utf-8 -*-

from __future__ import unicode_literals

from django.db import models

class Wojewodztwo(models.Model):

    nazwa
= models.CharField(max_length=70, verbose_name='Województwo')
   
class Meta:
        verbose_name
='Województwo'
        verbose_name_plural
='Województwa'

def __unicode__(self):
   
return self.nazwa

class Branza(models.Model):
    profil
= models.CharField(max_length=40, verbose_name='Branża')
   
class Meta:
        verbose_name
='Branża'
        verbose_name_plural
='Branże'

def __unicode__(self):
   
return self.profil


class Firma(models.Model):
    numer_id
= models.AutoField(primary_key=True)
    nazwa
= models.CharField(max_length=50, verbose_name='Nazwa firmy')
    slug
= models.SlugField(blank=True,max_length=255, verbose_name='Przyjazny adres url')
    wojewodztwo
= models.ForeignKey(Wojewodztwo, verbose_name='Województwo', null=True)
    profil
= models.ForeignKey(Branza, verbose_name='Branża', null=True)
    miasto
= models.CharField(max_length=50, verbose_name='Miasto')
    ulica
= models.CharField(max_length= 50, verbose_name='Ulica')
    numer
= models.CharField(max_length=8, verbose_name='Numer')
    numer_dom
= models.CharField(blank=True,max_length=8, verbose_name='Numer domu')
    telefon
= models.IntegerField(null=True,verbose_name='Numer tel.')
    opis
= models.TextField(verbose_name='Opis')
    www
= models.CharField(blank=True,max_length=40, verbose_name='WWW')
    email
= models.CharField(blank=True,max_length=30, verbose_name='E-mail')
   
class Meta:
        verbose_name
='Firmę'
        verbose_name_plural
='Firmy'

def __unicode__(self):
   
return self.nazwa



Bartłomiej Opajdowski

unread,
Jan 13, 2017, 1:56:33 PM1/13/17
to djan...@googlegroups.com
def __unicode__ ma być w ramach klasy !!!

--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „django-pl - grupa polskiej społeczności Django” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na django-pl+unsubscribe@googlegroups.com.
Aby opublikować wpis w tej grupie, wyślij e-maila na djan...@googlegroups.com.
Otwórz tę grupę na https://groups.google.com/group/django-pl.
Więcej opcji znajdziesz na https://groups.google.com/d/optout.



--
pozdrawiam
Bartłomiej Opajdowski

Andrzej

unread,
Jan 13, 2017, 1:58:52 PM1/13/17
to django-pl - grupa polskiej społeczności Django
*Nie odpowiadajcie mu więcej!*

To wszystko są mega-podstawy. Wszystkie zawarte w tutorialu django

Ode mnie więcej pomocy nie otrzymasz. Mam nadzieję, że inni tez wykorzystają ten czas lepiej, zamiast odpisywać

killerbees1982

unread,
Jan 13, 2017, 2:21:32 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Andrzej wydawało mi się że grupa dyskusyjna jest po to aby rozwiązywać problemy te duże i te małe.

Marcin Kallas

unread,
Jan 13, 2017, 3:15:31 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Polecam ten tutorial: https://tutorial.djangogirls.org/pl/ jest bardzo prosto i po polsku napisany choć oczywiście do dokumentacji warto zaglądać.
A tu http://django.pl/documentation/tutorial01/ po prostu przetłumaczenie dokumentacji na polski. Co prawda do starszej wersji django ale podstawy są chyba takie same do django 1.4 jak i django 1.10 (notabene ja działam, na 1.8 więc mogę czasami podać nieaktualne rozwiązanie :P)

A teraz chyba ostatnie moje uwagi co do kodu, bo muszę wrócić do budowy własnego projektu.

Jeśli chodzi o plik admin.py to wystarczy tak:

# -*- coding: utf-8 -*-
from django.contrib import admin
from .models import * # .models wystarczy ponieważ odnosisz się względem swojej aplikacji

admin.site.register(Wojewodztwo)
admin.site.register(Firma)
admin.site.register(Branza)

I tyle reszta kodu i te klasy pochodne od ModelAdmin są zbędne

models.py:

class Wojewodztwo(models.Model):
      pozycja_1 = coś tam
      pozycja_2 = coś tam
      ...
      pozycja_n = coś tam

      class Meta:
            verbose_name = 'Województwo'
            verbose_name_plural = 'Województwa'
   
      def __unicode__(self):
             return self.nazwa

I pozostałe analogicznie. Przed def __unicode__(self) musi być wcięcie ponieważ to musi być metoda tej klasy, a nie zdefiniowana funkcja. W pythonie jest właśnie to wspaniałe, że trzeba trzymać porządek w kodzie, bo każde wcięcie ma znaczenie. Jeszcze taka uwaga odnośnie kodu to ID nie ma konieczności definiować ponieważ django tworząc model i tak dodaje pozycje id (można o tym przeczytać w tutorialu podanym przez Andrzeja i na djangogirl chyba też ale nie mam pewności, bo dość dawno jak czytałem tamten tutorial. Twój problem z wyświetlaniem nazwy obiektu polega na tym, że nie ma tego wcięcia, a więc def __unicode__ to u ciebie nadpisana funkcja, a nie metoda klasy.


killerbees1982

unread,
Jan 13, 2017, 4:47:58 PM1/13/17
to django-pl - grupa polskiej społeczności Django
Dziękuję bardzo Marcin za praktyczne wskazówki. Jutro to zmienię i zobaczę czy chodzi. Jeśli chodzi o wcięcie przed funkcją def __unicode__ to wcześniej tak miałem tylko ktoś napisał że podpinam ją pod class Meta.

vbert

unread,
Jan 14, 2017, 12:55:43 PM1/14/17
to django-pl - grupa polskiej społeczności Django
Andrzej wydawało mi się że grupa dyskusyjna jest po to aby rozwiązywać problemy te duże i te małe.

To prawda, grupa do tego służy. 

Ty jednak mylisz pojęcia i nie czytasz ze zrozumieniem.

Nie wiem czy kiedykolwiek kodowałeś i w jakim języku, ale nie chcesz zrozumieć, 
że PODSTAWOWĄ i SPECYFICZNĄ cechą pythona 
(tak, to w tym właśnie języku napisano framework Django)  
SĄ WCIĘCIA w kodzie !!! 


W dniu piątek, 13 stycznia 2017 22:47:58 UTC+1 użytkownik killerbees1982 napisał:
Dziękuję bardzo Marcin za praktyczne wskazówki. Jutro to zmienię i zobaczę czy chodzi. Jeśli chodzi o wcięcie przed funkcją def __unicode__ to wcześniej tak miałem tylko ktoś napisał że podpinam ją pod class Meta.

I ten ktoś miał rację! Gdyż miałeś taki kod: 

class wojewodztwo(models.Model):

    nazwa = models.CharField(max_length=70, verbose_name='Województwo')
class Meta:
        verbose_name='Województwo'
        verbose_name_plural='Województwa'

        def __str__(self):
            return 'wojewodztwo: {}'.format(self.nazwa)
    
        def __unicode__(self):
            return 'wojewodztwo: {}'.format(self.nazwa)

Gdybyś prawidłowo "powcinał" kod (inne błędy teraz pomijam), to powinno to wyglądać tak: 

class wojewodztwo(models.Model):

    nazwa = models.CharField(max_length=70, verbose_name='Województwo')
    
    class Meta:
        verbose_name='Województwo'
        verbose_name_plural='Województwa'
 
    def __str__(self):

        return 'wojewodztwo: {}'.format(self.nazwa)
    
    def __unicode__(self):
        return 'wojewodztwo: {}'.format(self.nazwa) 
 
Widzisz różnicę? 
Tak jak ktoś już napisał, to nie są problemy, lecz absolutny brak podstaw.

Jak opanujesz te podstawy to zaoszczędzisz sobie oraz innym sporo czasu.

Pozdrawiam.
Reply all
Reply to author
Forward
0 new messages