Django-Admin: Fragen zum Anpassen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Django-Admin: Fragen zum Anpassen

Beitragvon sma » Donnerstag 23. April 2009, 07:32

[Kaum nutzt man das ein paar Monate nicht, schon ist das Wissen wieder weg...]

Ich würde im Admin-UI gerne hinter einem Zahlen-Eingabefeld noch den Text "Min" anzeigen, um klarzustellen, dass man dort Minuten eingeben soll. Wie kann ich dies am Einfachsten machen?

Ich würde außerdem gerne bei Text-Feldern die Höhe beeinflussen können. Diese sind mit ihren 10 Zeilen eigentlich immer zu hoch bzw. nicht hoch genug.

Für eine ManyToMany-Relation zu Kategorien würde ich statt eines Listensfelds mit selektierten Zeilen lieber entweder zwei Listen mit den ausgewählten und auswählbaren Kategorien sehen oder vorzugsweise eine kommagetrenne Liste der Katogrien, die man dann in einen weiteren Fenster bearbeiten kann, wenn man das will. Gibt es da schon etwas Fertiges?

Schließlich käme es mir gelegen, wenn ich die Label über den Eingabefeldern anzeigen und dafür mehr als ein Feld nebeneinander anzeigen könnte, aber das geht auch in der neusten Version noch nicht, oder?

Stefan
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Donnerstag 23. April 2009, 08:38

Ein paar Dinge ergeben sich aus der Dokumentation: Setzt man `filter_horizontal=('categories',)` so wird die Liste durch das beschriebene Widgets aus zwei nebeneinander stehenden Listen ersetzt. Sieht nicht schön aus, ist aber nicht ganz so fehleranfällig zu bedienen.

Mehrere Felder nebeneinander bekommt man über `fieldsets`. Und wenn man bei der CSS-Definition `.aligned label` das `float:left` entfernt, stehen die Label auch über den Texten.

Der Rest ergibt sich, wenn man den Quelltext liest: Um ein Widget zu modifizieren, habe ich mir folgenden Hack für das AdminModel rausgesucht:

Code: Alles auswählen

    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'subtitle':
            del kwargs['request']
            kwargs['widget'] = admin.widgets.AdminTextareaWidget(attrs={'rows': 3})
            return db_field.formfield(**kwargs)
       
        return super(VideoAdmin, self).formfield_for_dbfield(db_field, **kwargs)


Für meine erste Aufgabe habe ich mir diesen hässlichen Code gebaut:

Code: Alles auswählen

class UnitTextField(admin.widgets.AdminIntegerFieldWidget):
    def render(self, *args, **kwargs):
        from django.utils.safestring import mark_safe
        return super(UnitTextField, self).render(*args, **kwargs) + mark_safe(" Min")

den ich dann ebenfalls in `formfield_for_dbfield` als Widget einbaue.

Danke für's Zuhören.

Stefan
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Re: Django-Admin: Fragen zum Anpassen

Beitragvon jens » Freitag 24. April 2009, 08:43

sma hat geschrieben:Ich würde außerdem gerne bei Text-Feldern die Höhe beeinflussen können. Diese sind mit ihren 10 Zeilen eigentlich immer zu hoch bzw. nicht hoch genug.

Ich hab dafür ein kleines JS Skript gemacht:
[code=]function textarea_resize() {
//
// Resize all textareas
//
textareas = document.getElementsByTagName("textarea");
for (var i = 0; i <= textareas.length-1; i++) {
try {
textarea = textareas[i];
try {
rows = textarea.firstChild.data.split("\n").length;
if (rows > 30) {
rows = 30;
}
} catch(e) {
rows = 5;
}
textarea.rows = rows;
} catch (e) {
alert("textarea_resize() error:" + e);
}
}
}
textarea_resize()[/code]

Kann man z.B. in .../admin/base_site.html einbauen.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 29. April 2009, 08:48

Das ganze nochmal per jQuery:

Code: Alles auswählen

<script type="text/javascript">
MAX_ROWS = 25;
$(document).ready(function(){
  $("textarea").each(function (i) {
    rows = this.value.split("\n").length;
    if (rows > MAX_ROWS) {rows = MAX_ROWS;}
    this.rows = rows;
  });
});
</script>

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Beitragvon ferix » Sonntag 17. Mai 2009, 23:26

Mehrere Felder nebeneinander bekommt man über `fieldsets`. Und wenn man bei der CSS-Definition `.aligned label` das `float:left` entfernt, stehen die Label auch über den Texten.


Ich würde dir gern nochmals zuhören :)
Wie bekommt man über fieldsets mehrere Felder nebeneinander?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Montag 18. Mai 2009, 21:15

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets hat geschrieben:To display multiple fields on the same line, wrap those fields in their own tuple. In this example, the first_name and last_name fields will display on the same line:

Code: Alles auswählen

{
'fields': (('first_name', 'last_name'), 'address', 'city', 'state'),
}

Stefan
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Beitragvon ferix » Montag 18. Mai 2009, 23:05

Wer lesen kann ist klar im Vorteil :)
Mensch da muss ich mich jetzt wohl ma wieder des Docs überfliegens schuldig bekennen ^^
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Beitragvon ferix » Mittwoch 20. Mai 2009, 11:16

Ist es eigentlich auch irgendwie möglich fieldsets nebeneinander zu positionieren!?
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Beitragvon ferix » Freitag 22. Mai 2009, 08:52

Geht wohl nicht? :?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Freitag 22. Mai 2009, 10:58

Keine Ahnung. Automatisch nicht. Aber mit genug CSS-fu sollte man's hinbekommen. Wenn man die Templates nicht ändern will, wäre vielleicht jquery eine Alternative. Hat zwar was von Monkey-Patching, aber egal, oder?

Stefan

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder