V Djangu se velice hezky vytvářejí mocné modely.
Proč se ale napojení na tyto modely často provádí textově?
Například administraci svážu s modelem takovouto textovou formou
class HumanAdmin(admin.ModelAdmin):
list_display = ('name', 'surname', 'birth_date', 'sex') # textové vazby
list_filter = ('sex') # textové vazby
search_fields = ['name', 'surname'] # textové vazby
Nebo formulář svážu s modelem opět textem
class HumanForm(forms.ModelForm):
name = forms.CharField()
surname = forms.CharField()
birth_date = forms.DateField()
sex = forms.BooleanField()
class Meta:
model = Human
fields = ('name', 'surname', 'birth_date', 'sex') # textové vazby
Přináší to problémy:
- možnost překlepu v názvech bez syntaktické kontroly
- vznik chyby při přejmenování modelu nebo jeho atributu
- IDE nenapovídá
- opakovaný řetězec na více místech se špatně udržuje
Nelze propojení řešit nějakým sofirtikovanějším způsobem, ve smyslu ?
fields = (Human.name.__name__, Human.surname.__name__, Human.birth_date.
__name__, Human.sex.__name__)
Problém je, že proměnná nemá atribut __name__ (jako má třeba funkce)
Případně mě napadá, že by model musel obsahovat konstanty s názvy atributů,
např.
classHuman(models.Model):
name = models.TextField()
surname = models.TextField()
birth_date = models.DateField()
sex = models.BooleanField()
NAME = "name"
SURNAME = "surname"
BIRTH_DATE = "birth_date"
SEX = "sex"
Řetězce jsou alespoň pohromadě a na jednom místě. Pro případné úpravy do
budoucna lépe uchopitelné.
Poté by šlo používat takto:
fields = (Human.NAME, Human.SURNAME, Human.BIRTH_DATE, Human.SEX)
Ale není to DRY a nikde sem to neviděl :( tak jsem na pochybách.
Proto se chci zeptat:
1. Proč se používají řetězce jako odkazy na atributy tříd ?
2. Používá se nějaký sofistikovaný způsob ?
Díky za reakce.
--
--
E-mailová skupina [email protected]
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs
ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete
e-mail na adresu [email protected].
Chcete-li zobrazit tuto diskusi na webu, navštivte
https://groups.google.com/d/msgid/django-cs/929d65b7-d89f-4237-90c7-a7bf7d4d5188%40googlegroups.com.
Další možnosti najdete na adrese https://groups.google.com/d/optout.