2011-02-07 9 views
6

W mojej witrynie Django 1.2.4, chciałbym skierować użytkownika na stronę administratora, która jest wstępnie wypełniona pewnymi wartościami, na podstawie bieżących danych, z którymi pracuje. Na przykład:Administrator Django: Wstępne zapełnianie wartości z POST lub GET?

{% for person in people %} 
    <tr> 
     <td>{{person}}</td> 
     <td><a href='admin/foo/bar/add?name={{person}}'>Create a foo for {{person}}</td> 
    </tr> 
{% endfor %} 

Następnie, gdy użytkownik kliknie na link, pole name jest wstępnie wypełnione wartością {{person}}.

Czy interfejs Django Admin obsługuje to? Formularze administratora Django używają POST, ale nie jestem pewien, jak dodać dane POST do żądania z szablonu.

Mogę ustawić zmienne GET, a następnie użyć niestandardowego kodu JavaScript w formularzu, aby odpowiednio ustawić wartości.

Odpowiedz

10

Zgodnie z kodem źródłowym (i szybkiego testu), Django nie obsługują parametrów GET jako wartości początkowe dla modelforms w admin. Obsługuje nawet wiele relacji z wieloma osobami.

Czy próbowałeś tego? Może to brakujący slash na końcu adresu URL.

admin/foo/bar/add?name=Foobar 

Prawdopodobnie zostanie przekierowany do ...

admin/foo/bar/add/ 

... więc upuszczenie ciągu kwerendy. Więc spróbuj dodać slash tam i zobacz, czy to działa.

admin/foo/bar/add/?name={{ person }} 

Update (wstępne napełnienie pola Boolean)

tylko w przypadku kogoś innego, ma problemy z wstępne napełnienie logicznych dziedzinach:

Jeśli przekazać dowolną wartość w ogóle w ciągu kwerendy, na przykład admin/foo/bar/add/?is_active=foo, to wypełni pole is_active wartością True (ponieważ każdy niepusty łańcuch jest wartością true). Dlatego, jeśli chcesz „odznaczyć” pole wyboru dla danego pola, przechodzą żadnej wartości, jak admin/foo/bar/add/?is_active=


Jest to fragment kodu z metody add_view na ModelAdmin odpowiedzialnej za pomocą parametrów GET jako Wartości początkowe. http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L878

# Prepare the dict of initial data from the request. 
# We have to special-case M2Ms as a list of comma-separated PKs. 
initial = dict(request.GET.items()) 
for k in initial: 
    try: 
     f = opts.get_field(k) 
    except models.FieldDoesNotExist: 
     continue 
    if isinstance(f, models.ManyToManyField): 
     initial[k] = initial[k].split(",") 

form = ModelForm(initial=initial)