Django-Admin: Fragen zum Anpassen

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

[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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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>

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

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

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

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

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

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

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
Antworten