2008-11-07 3 views
7

Bei einer Django.db Modell Klasse:Wie fügt man Standard (versteckte) Werte hinzu, um Vorlagen in Django zu erstellen?

class P(models.Model): 
    type = models.ForeignKey(Type) # Type is another models.Model class 
    name = models.CharField() 

, wo man ein neuen P mit einer bestimmten Art zu schaffen wünscht, dh wie eine make „Typ“ Standard, verstecktes Feld zu sein (vom Benutzer) wird in dem Typ likeso gegeben:

http://x.y/P/new?type=3 

So in der Form, dass kein Feld "Typ" erscheint, aber wenn der P gespeichert ist, wird seine Art haben id 3 (dh Type.objects.get (pk = 3)).

Zweitens, wie ist eine (& ist es möglich) geben Sie einen "Standard" Typ in der URL, über urls.py, bei der Verwendung von generischen Django Ansichten, nämlich.

Ich fand, dass schrecklich schwierig zu beschreiben, was ein Teil des Problems sein kann. :) Input wird sehr geschätzt!

Antwort

5

Um einen Standardfremdschlüssel in einem Modell hat:

mydefault = Type.objects.get(pk=3) 

class P(models.Model): 
    type = models.ForeignKey(Type, default=mydefault) # Type is another models.Model class 
    name = models.CharField() 

Beachten Sie, dass pk=x mit ziemlich hässlich ist, wie im Idealfall sollten Sie nicht egal, was der Primärschlüssel gleich. Versuchen Sie, mit einem anderen Attribut zum gewünschten Objekt zu gelangen.

Here ‚s, wie Sie Standardwerte in Ihren URLs setzen:

# URLconf 
urlpatterns = patterns('', 
    (r'^blog/$', 'blog.views.page'), 
    (r'^blog/page(?P<num>\d+)/$', 'blog.views.page'), 
) 

# View (in blog/views.py) 
def page(request, num="1"): 
    # Output the appropriate page of blog entries, according to num. 

Im obigen Beispiel zeigen beide URL-Muster auf die gleiche Ansicht - blog.views.page - aber das erste Muster erfasst nichts von der URL. Wenn das erste Muster übereinstimmt, verwendet die Funktion page() ihr Standardargument für num, "1". Wenn das zweite Muster übereinstimmt, verwendet page() den von der Regex erfassten num-Wert.

8

Das Widget django.forms.widgets.HiddenInput wird Ihr Feld als ausgeblendet darstellen.

In den meisten Fällen werden Sie feststellen, dass alle versteckten Formularwerte auch als URL-Parameter angegeben werden können. Mit anderen Worten:

<form action="new/{{your_hidden_value}}" method="post"> 
.... 
</form> 

und in urls.py:

^/new/(?P<hidden_value>\w+)/ 

ziehe ich diese Technik selbst, weil ich mich nur wirklich versteckt Formularfelder, um zu finden, wenn ich den Primärschlüssel eines Modells zu verfolgen brauchen instance - in diesem Fall dient eine "edit/pkey" -URL sowohl dem Zweck, die Bearbeitung des Formulars einzuleiten, als auch das Empfangen des POST beim Speichern.

Verwandte Themen