Seite 1 von 1

Django-Admin: Fragen zum Anpassen

Verfasst: Donnerstag 23. April 2009, 07:32
von sma
[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

Verfasst: Donnerstag 23. April 2009, 08:38
von sma
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

Re: Django-Admin: Fragen zum Anpassen

Verfasst: Freitag 24. April 2009, 08:43
von jens
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: Alles auswählen

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()
Kann man z.B. in .../admin/base_site.html einbauen.

Verfasst: Mittwoch 29. April 2009, 08:48
von jens
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>

Verfasst: Sonntag 17. Mai 2009, 23:26
von ferix
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?

Verfasst: Montag 18. Mai 2009, 21:15
von sma
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

Verfasst: Montag 18. Mai 2009, 23:05
von ferix
Wer lesen kann ist klar im Vorteil :)
Mensch da muss ich mich jetzt wohl ma wieder des Docs überfliegens schuldig bekennen ^^

Verfasst: Mittwoch 20. Mai 2009, 11:16
von ferix
Ist es eigentlich auch irgendwie möglich fieldsets nebeneinander zu positionieren!?

Verfasst: Freitag 22. Mai 2009, 08:52
von ferix
Geht wohl nicht? :?

Verfasst: Freitag 22. Mai 2009, 10:58
von sma
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