Consigli e funzionalità Django preferiti?


308

Ispirato alla serie di domande "Funzioni nascoste di ...", sono curioso di conoscere i tuoi consigli Django preferiti o le funzionalità meno conosciute ma utili che conosci.

  • Per favore, includi solo un suggerimento per risposta.
  • Aggiungi eventuali requisiti di versione di Django.

Risposte:


221

Sto per iniziare con un suggerimento da parte mia :)

Utilizzare os.path.dirname () in settings.py per evitare dirnomi codificati.

Non tracciare il percorso del codice nelle impostazioni.py se si desidera eseguire il progetto in posizioni diverse. Utilizzare il seguente codice in settings.py se i modelli e i file statici si trovano nella directory del progetto Django:

# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, "templates"),
)

Riconoscimenti: ho ricevuto questo consiglio dallo screencast " Django From the Ground Up ".


75
Non dovresti sottovalutare le persone che rispondono alle loro stesse domande. È incoraggiato, anche se è predeterminato.
Paolo Bergantino,

19
Questa è una buona idea che ho ancora difficoltà a capire perché non è predefinito. Quante persone testano e distribuiscono sulla stessa macchina?
SingleNegationElimination,

19
In questo modo si allevia da sempre tipo os.path.join (), che diventa fastidioso abbastanza veloce: j = lambda filename: os.path.join(PROJECT_DIR, filename). Quindi devi solo digitare j("static").
wr.

13
Se sei su Windows, sostituisci le barre rovesciate: os.path.join (PROJECT_DIR, "modelli"). Sostituisci ('\\', '/')
Peter Mortensen,

7
Se ti piace davvero risolvere questo problema in Django, lascia un commento a code.djangoproject.com/ticket/694 chiedendo agli sviluppatori principali di riconsiderare la wontfixdecisione.
sorin,

128

Installa Django Command Extensions e pygraphviz e quindi lancia il seguente comando per ottenere una visualizzazione del modello Django davvero carina:

./manage.py graph_models -a -g -o my_project.png

Bene, non è stato possibile installare correttamente il pygraphviz in Windows, ma può comunque essere nascosto dal file dot usando graphviz.
Monaco

Adoro condividere diagrammi modello con questo sicuramente un +1
BozoJoe,

Esiste un'opzione svg per questo?
Keyo,

l'immagine di output sembra essere stata eliminata ora
Brian Wigginton il

119

Usa invece il decoratore di django-fastidioso .render_torender_to_response

@render_to('template.html')
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return {'bars': bars}

# equals to
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return render_to_response('template.html',
                              {'bars': bars},
                              context_instance=RequestContext(request))

Modificato per sottolineare che la restituzione di un HttpResponse (come un reindirizzamento) farà cortocircuitare il decoratore e funzionerà come previsto.


4
@becomingGuru - succede automaticamente.
Dominic Rodger,

15
Questo va bene, a meno che tu non stia restituendo alcuni HttpResponseRedirect () e alcuni render_to_response () s. Quindi i reindirizzamenti falliscono.
Matthew Schinckel,

17
Non mi piace "Esplicito è meglio che implicito". Il decoratore non dice quando eseguirà il rendering_to.
Tamás Szelei,

2
@Matthew Schinckel in realtà non incasina i reindirizzamenti - se restituisci un oggetto HttpResponse lo passa semplicemente senza modificarlo
Jiaaro

20
Credo che questo approccio sia ora ridondante a partire da Django 1.3, vedi django.shortcuts.render () docs.djangoproject.com/en/dev/topics/http/shortcuts/#render
Dolph

101

C'è una serie di tag personalizzati che utilizzo in tutti i modelli del mio sito. Alla ricerca di un modo per caricarlo automaticamente (DRY, ricordi?), Ho trovato quanto segue:

from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')

Se lo metti in un modulo caricato per impostazione predefinita (ad esempio il tuo urlconf principale), avrai i tag e i filtri del tuo modulo tag personalizzato disponibili in qualsiasi modello, senza usare {% load custom_tag_module %}.

L'argomento passato a template.add_to_builtins()può essere qualsiasi percorso del modulo; il tuo modulo tag personalizzato non deve vivere in un'applicazione specifica. Ad esempio, può anche essere un modulo nella directory principale del progetto (ad es. 'project.custom_tag_module').


@Steef, mi hai appena salvato un sacco di tempo / angoscia / byte, grazie.
orokusaki,

Veramente bello. Grazie. Anche un repository di tag personalizzati sarebbe fantastico per condividere contenuti, non credi?
Leandro Ardissone,

È fantastico fino a quando qualcun altro deve mantenere il tuo codice. Pensa: "principio della minima magia"
Rich

96

Virtualenv + Python = salvavita se stai lavorando su più progetti Django e c'è la possibilità che tutti non dipendano dalla stessa versione di Django / un'applicazione.


15
Questo è SOLO modo di rotolare!
postfuturista il

3
Potresti aggiungere alcuni link tutorial per virtualenv con django?
BozoJoe,

2
@BozoJoe: Fate questo in vostro terminale: virtualenv myNewEnv --no-site-packages; . myNewEnv/bin/activate; pip install django; E funziona e basta!
SingleNegationElimination

87

Non codificare i tuoi URL!

Utilizzare invece i nomi URL e la reversefunzione per ottenere l'URL stesso.

Quando definisci i tuoi mapping URL, dai un nome ai tuoi URL.

urlpatterns += ('project.application.views'
   url( r'^something/$', 'view_function', name="url-name" ),
   ....
)

Assicurati che il nome sia univoco per URL.

Di solito ho un formato coerente "project-appplication-view", ad esempio "cbx-forum-thread" per una vista thread.

AGGIORNAMENTO (rubare senza vergogna l'aggiunta di Ayaz ):

Questo nome può essere utilizzato nei modelli con il urltag .


1
Sono d'accordo al 100% su questo. Ho iniziato usando gli URL hard coded, e mi ha morso un progetto quando ho cambiato un po 'il formato dell'URL per adattarmi ad alcune modifiche. Mi sono preso il tempo di tornare indietro e scavare tutto e sostituire gli URL hard coded. La mia unica grande lamentela è che gli errori dei tag url uccidono l'intera pagina mentre il codice hard rovina solo il singolo link.
Ricree

21
Questa non dovrebbe essere una caratteristica nascosta, questa è la migliore pratica e l'unico modo per volare.
Skylar Saveland,

1
@skyl Non è certo "l'unico modo di volare". Ero a uno sprint di sviluppo di Django e Adrian Holovaty (uno dei creatori di Django) ha detto che non usa nemmeno il urltag ... La sua posizione è che gli URL non dovrebbero cambiare comunque (se vuoi essere amichevole con il tuo utenti).
TM.

puoi usarlo anche nei template, come in {% url path.to.view.name arg1 arg2 %} docs.djangoproject.com/en/dev/ref/templates/builtins/…
SingleNegationElimination

Se usi jinja2, aggiungi solo reversecosì environment.filters['url'] = django.core.urlresolvers.reversee puoi usarlo nei tuoi modelli in questo modo: {{ 'view-name'|url(arg1, arg2)|e }}(la "e" è necessaria per sfuggire ad alcuni caratteri per l'inclusione in HTML)
SingleNegationElimination


79

Non scrivere le tue pagine di accesso. Se stai usando django.contrib.auth.

Il vero, sporco segreto è che se stai usando anche django.contrib.admin e django.template.loaders.app_directories.load_template_source è nei tuoi caricatori di modelli, puoi anche liberare i tuoi modelli!

# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
    (r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
    (r'^accounts/logout/$','views.logout'),
)

1
Freddo! Non sapevo che potremmo riutilizzare la pagina di accesso degli amministratori. Grazie!
Joshua Partogi,

66

I processori di contesto sono fantastici.

Supponi di avere un modello utente diverso e desideri includerlo in ogni risposta. Invece di fare questo:

def myview(request, arg, arg2=None, template='my/template.html'):
    ''' My view... '''
    response = dict()
    myuser = MyUser.objects.get(user=request.user)
    response['my_user'] = myuser
    ...
    return render_to_response(template,
                              response,
                              context_instance=RequestContext(request))

I processi di contesto ti danno la possibilità di passare qualsiasi variabile ai tuoi modelli. Di solito inserisco il mio 'my_project/apps/core/context.py:

def my_context(request):
    try:
        return dict(my_user=MyUser.objects.get(user=request.user))
    except ObjectNotFound:
        return dict(my_user='')

Nel tuo settings.pyaggiungi la seguente riga al tuoTEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (
    'my_project.apps.core.context.my_context',
    ...
)

Ora ogni volta che viene fatta una richiesta include my_userautomaticamente la chiave.

Anche i segnali vincono.

Ho scritto un post sul blog alcuni mesi fa, quindi ho intenzione di tagliare e incollare:

Out of the box Django ti dà diversi segnali che sono incredibilmente utili. Hai la possibilità di fare le cose pre e postare il salvataggio, l'iniz, l'eliminazione o anche quando una richiesta viene elaborata. Quindi, allontaniamoci dai concetti e dimostriamo come vengono utilizzati. Supponiamo di avere un blog

from django.utils.translation import ugettext_lazy as _
class Post(models.Model):
    title = models.CharField(_('title'), max_length=255)
    body = models.TextField(_('body'))
    created = models.DateTimeField(auto_now_add=True)

Quindi, in qualche modo, vuoi avvisare uno dei tanti servizi di ping-blog che abbiamo creato un nuovo post, ricostruire la cache dei post più recenti e twittare su di esso. Bene, con i segnali hai la possibilità di fare tutto questo senza dover aggiungere alcun metodo alla classe Post.

import twitter

from django.core.cache import cache
from django.db.models.signals import post_save
from django.conf import settings

def posted_blog(sender, created=None, instance=None, **kwargs):
    ''' Listens for a blog post to save and alerts some services. '''
    if (created and instance is not None):
        tweet = 'New blog post! %s' instance.title
        t = twitter.PostUpdate(settings.TWITTER_USER,
                               settings.TWITTER_PASSWD,
                               tweet)
        cache.set(instance.cache_key, instance, 60*5)
       # send pingbacks
       # ...
       # whatever else
    else:
        cache.delete(instance.cache_key)
post_save.connect(posted_blog, sender=Post)

Andiamo, definendo quella funzione e usando il segnale post_init per connettere la funzione al modello Post ed eseguirla dopo che è stata salvata.


4
I segnali di Django sono una caratteristica indispensabile per me in questi giorni, quando si confrontano i framework web. Scrivere un forum debolmente accoppiato, diciamo, che può ascoltare, diciamo, gli aggiornamenti da un modulo "firma", ma che in realtà non richiede che quel modulo funzioni, e che può funzionare anche con moduli compatibili che implementano la stessa funzione, è fantastico. Non so perché i segnali non siano più conosciuti e popolari.
Lee B,

I segnali sono molto importanti per evitare l'accoppiamento stretto e il disordine del codice in generale se utilizziamo alcune app riutilizzabili nel nostro progetto. Hai fornito un esempio eccellente per l'accoppiamento libero di app django, +1 per questo.
Lukasz Korzybski,

Sai se i segnali sono asincroni?
Kedare,

"Supponi di avere un modello utente diverso e che desideri includerlo in ogni risposta." - Metti l'utente nella sessione . Ciò consente di risparmiare un hit del database per ogni richiesta.
Jammon,

Le chiamate dei segnali sono sincrone. A mio avviso, una sorta di meccanismo di lavoro asincrono è più adatto, ad esempio, alla pubblicazione su Twitter / Facebook / ecc. (Ad esempio - rabbitmq), quindi gli utenti del nostro sito Web non si bloccano su richiesta.
gorsky,

58

Quando stavo iniziando, non sapevo che esistesse un paginatore , assicurati di conoscerne l'esistenza !!


2
: D lo stesso per me! Ho passato giorni a impaginare!
vikingosegundo,

46

Usa IPython per saltare nel tuo codice a qualsiasi livello ed eseguire il debug usando la potenza di IPython. Dopo aver installato IPython, inserisci questo codice ovunque desideri eseguire il debug:

from IPython.Shell import IPShellEmbed; IPShellEmbed()()

Quindi, aggiorna la pagina, vai alla finestra del tuo server e sarai in una finestra interattiva di IPython.

Ho uno snippet impostato in TextMate, quindi digito ipshell e premi tab. Non potrei vivere senza di essa.


22
Meglio installare ipdbe quindi digitareipdb.set_trace()
Tomasz Zieliński

Oppure usa il debugger di Eclipse / PyDev. :-)
jMyles,

3
import ipdb; ipdb.set_trace () FTW!
Hassek,

43

Esegui un server SMTP di sviluppo che produrrà semplicemente tutto ciò che gli viene inviato (se non desideri installare effettivamente SMTP sul tuo server di sviluppo).

riga di comando:

python -m smtpd -n -c DebuggingServer localhost:1025

12
puoi usare console e file backend e-mail in django 1.2 per lo stesso scopo
Dmitry Shevchenko

eccezionale! perfetto per la registrazione! +1
BozoJoe,

3
Alternativa in Django 1.2 con impostazioni: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' .. che stamperà l'e-mail manage.pysull'output.
vdboor,

41

Dalla documentazione di django-admin :

Se usi la shell Bash, prendi in considerazione l'installazione dello script di completamento bash di Django, che vive nella extras/django_bash_completiondistribuzione di Django. Abilita il completamento con tabulazione django-admin.pye i manage.pycomandi, in modo da poter, ad esempio ...

  • Tipo django-admin.py.
  • Premere [TAB] per vedere tutte le opzioni disponibili.
  • Digitare sql, quindi [TAB], per visualizzare tutte le opzioni disponibili i cui nomi iniziano con sql.

1
Questo è più utile di quanto mi aspettassi. Grazie!
Jeeyoung Kim,

Questo è di default almeno nei nuovi Ubuntu. :-) Sono rimasto stupito quando è uscito dal nulla.
odinho - Velmont,

40

La facilità./manage.py runserver_plus fornita con django_extensions è davvero fantastica.

Crea una pagina di debug migliorata che, tra le altre cose, utilizza il debugger Werkzeug per creare console di debug interattive per ogni punto dello stack (vedi screenshot). Fornisce inoltre un metodo di debug molto utile dump()per la visualizzazione di informazioni su un oggetto / frame.

inserisci qui la descrizione dell'immagine

Per installare, puoi usare pip:

pip install django_extensions
pip install Werkzeug

Quindi aggiungi la 'django_extensions'tua INSTALLED_APPStupla settings.pye avvia il server di sviluppo con la nuova estensione:

./manage.py runserver_plus

Questo cambierà il modo in cui esegui il debug.


37

Mi piace usare il pdb di debug di Python per eseguire il debug di progetti Django.

Questo è un link utile per imparare a usarlo: http://www.ferg.org/papers/debugging_in_python.html


13
Questa è una manna dal cielo. Per dare qualche informazione in più, basta aggiungere questo: "import pdb; pdb.set_trace ()" su qualsiasi riga del tuo codice. Aggiorna la tua pagina. Si bloccherà. Ora vai alla finestra del terminale in cui stai eseguendo il server di sviluppo. Ora dovrebbe essere una shell interattiva in cui è possibile accedere a tutte le variabili così come sono in quel punto del codice in cui è stato incollato il codice di debug.
priestc,


36

Usa Jinja2 insieme a Django.

Se trovi che il linguaggio del modello di Django è estremamente restrittivo (come me!), Non devi essere bloccato con esso. Django è flessibile e il linguaggio dei template è liberamente associato al resto del sistema, quindi basta collegare un altro linguaggio dei template e usarlo per rendere le tue risposte http!

Uso Jinja2 , è quasi come una versione potenziata del linguaggio template django, usa la stessa sintassi e ti permette di usare espressioni in if statement! non creare più tag if personalizzati come if_item_in_list! puoi semplicemente dire %{ if item in list %}, o{% if object.field < 10 %} .

Ma non è tutto; ha molte più funzioni per facilitare la creazione di modelli, che non posso seguire tutte qui.


Uso e mi diverto anche con Jinja2, ma ho scoperto che ci sono alcuni accoppiamenti alle applicazioni "contrib". In particolare, lo strumento di amministrazione è piuttosto legato ai modelli di Django. Inoltre, ho dovuto ricreare i decoratori di login in contrib.auth per essere amichevoli con Jinja2, ma non troppo.
Joe Holloway,

24
Non sostituire il sistema di template con jinja2, basta "aggiungerlo", non rimuovere i templtes di django. Usa Jinja2 per le tue viste e lascia che l'interfaccia di amministrazione continui a usare il linguaggio template di django.
hasen

4
Sono d'accordo duramente con questo. La sintassi limitata di Django è tollerabile, la maggior parte delle volte, ma quando arrivi al punto di creare tag personalizzati e scopri quanto sia difficile, Jinja2 è una boccata d'aria fresca
SingleNegationElimination,

Inoltre, se si vuole fare qualsiasi metaprogrammazione sulla sorgente del template, Jinja2 è molto più piacevole, dato che è possibile accedere direttamente alla AST di modelli analizzati. Camminare su AST rende le attività come scoprire quali modelli estendono un modello di base o elencare le variabili non associate in un blocco sorgente del modello, quasi banalmente facile.
rcoder,

5
Per fortuna in Django 1.2 il tag IF è molto più intelligente
Nixarn,

35

Aggiungi assert Falseil codice di visualizzazione per scaricare le informazioni di debug.


4
Penso che affermare False sia più intuitivo = D
Jiaaro

13
se stai eseguendo il tuo progetto nel server dev django, usa il modulo pdb di python. È un modo molto più potente per eseguire il debug: import pdb; pdb.stack_trace ()
mazelife,

pdb è molto utile, è probabile che tu abbia il timeout delle connessioni a meno che tu non sia molto veloce nel debug.
Stephen Paulger,

4
Uso sempre 5 / 0me stesso. Perché cinque? Nessuna idea.
JasonSmith,

@StephenPaulger davvero? Il mio browser (firefox / w firebug) sembra contento di attendere diversi minuti per una risposta mentre eseguo il debug.
TM.

34

Ciò si aggiunge alla risposta sopra relativa ai nomi degli URL Django e all'invio inverso degli URL .

I nomi URL possono anche essere effettivamente utilizzati all'interno dei modelli. Ad esempio, per un determinato pattern URL:

url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')

puoi avere i seguenti modelli:

<a href="{% url project_team project.id %}">Team</a>

27

Poiché le "viste" di Django devono essere solo callable che restituiscono un HttpResponse, è possibile creare facilmente viste basate su classi come quelle di Ruby on Rails e di altri framework.

Esistono diversi modi per creare viste basate su classi, ecco la mia preferita:

from django import http

class RestView(object):
    methods = ('GET', 'HEAD')

    @classmethod
    def dispatch(cls, request, *args, **kwargs):
        resource = cls()
        if request.method.lower() not in (method.lower() for method in resource.methods):
            return http.HttpResponseNotAllowed(resource.methods)
        try:
            method = getattr(resource, request.method.lower())
        except AttributeError:
            raise Exception("View method `%s` does not exist." % request.method.lower())
        if not callable(method):
            raise Exception("View method `%s` is not callable." % request.method.lower())
        return method(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        return http.HttpResponse()

    def head(self, request, *args, **kwargs):
        response = self.get(request, *args, **kwargs)
        response.content = ''
        return response

Puoi aggiungere ogni sorta di altre cose come la gestione e l'autorizzazione condizionale delle richieste nella vista di base.

Dopo aver configurato le visualizzazioni, urls.py apparirà in questo modo:

from django.conf.urls.defaults import *
from views import MyRestView

urlpatterns = patterns('',
    (r'^restview/', MyRestView.dispatch),
)

2
FWIW, gli autori di django usano effettivamente viste basate sulla classe in alcuni punti, ad esempio contrib.formtools: code.djangoproject.com/browser/django/trunk/django/contrib/…
mazelife

3
Se aggiungi un metodo call , puoi creare una classe chiamata RestfulResource e quindi puntare il tuo urls.py alle istanze.
Stephen Paulger,

1
Le nuove viste generiche (Django 1.3?) Sono basate sulla classe.
gorsky,

21

Invece di usare render_to_responseper associare il tuo contesto a un modello e renderlo (che è quello che i documenti Django mostrano di solito) usa la vista generica direct_to_template. Fa la stessa cosa render_to_response, ma aggiunge automaticamente RequestContext al contesto del modello, consentendo implicitamente l'uso dei processori di contesto. Puoi farlo manualmente usando render_to_response, ma perché preoccuparsi? È solo un altro passo da ricordare e un altro LOC. Oltre a utilizzare i processori di contesto, avere RequestContext nel tuo modello ti consente di fare cose come:

<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a> 

che è molto utile. In effetti, +1 su viste generiche in generale. I documenti Django li mostrano principalmente come scorciatoie per non avere nemmeno un file views.py per app semplici, ma puoi anche usarli all'interno delle tue funzioni di visualizzazione:

from django.views.generic import simple

def article_detail(request, slug=None):
    article = get_object_or_404(Article, slug=slug)
    return simple.direct_to_template(request, 
        template="articles/article_detail.html",
        extra_context={'article': article}
    )

Salva ancora più LOC usando il decoratore @render_to disponibile in django-fastidioso. bitbucket.org/offline/django-annoying
pithyless

6
..o utilizzare il nuovo rendermetodo di scelta rapida da Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortcuts/#render )
gorsky

20

Non ho abbastanza reputazione per rispondere al commento in questione, ma è importante notare che se stai per usare Jinja , NON supporta il carattere "-" nei nomi dei blocchi modello, mentre Django lo fa. Ciò mi ha causato molti problemi e ha perso tempo a cercare di rintracciare il messaggio di errore molto oscuro che ha generato.


Una nota che può o meno essere applicabile a "oscuri messaggi di errore di jinja". Assicurati di impostare TEMPLATE_DEBUG = False in settings.py. Per qualche motivo questo ti darà errori significativi dai modelli Jinja.
Carl G,

19

L' app webdesign è molto utile quando si inizia a progettare il tuo sito Web. Una volta importato, puoi aggiungerlo per generare testo di esempio:

{% load webdesign %}
{% lorem 5 p %}

4
Cordiali saluti, per chiunque usi Jinja2 invece dei modelli Django, puoi fare: {{lipsum (5)}}
Joe Holloway,


19

Tutti sanno che esiste un server di sviluppo che puoi eseguire con "manage.py RunServer", ma sapevi che esiste anche una vista di sviluppo per la gestione di file statici (CSS / JS / IMG)?

I nuovi arrivati ​​sono sempre perplessi perché Django non ha alcun modo di servire file statici. Questo perché il team di sviluppo pensa che sia il lavoro per un server Web nella vita reale.

Ma durante lo sviluppo, potresti non voler configurare Apache + mod_wisgi, è pesante. Quindi puoi semplicemente aggiungere quanto segue a urls.py:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': '/path/to/media'}),

Il tuo CSS / JS / IMG sarà disponibile su www.yoursite.com/site_media/.

Naturalmente, non utilizzarlo in un ambiente di produzione.


6
Lo uso in modalità dev, e solo per essere sicuro di non dimenticare di disattivarlo in produzione, avvolgo la regola URL in un DEBUG solo a condizione.
sghael

18

L'ho imparato dalla documentazione per le miniature delle sorl app . Puoi utilizzare la parola chiave "as" nei tag del modello per utilizzare i risultati della chiamata altrove nel modello.

Per esempio:

{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>

Questo è menzionato nel passaggio nella documentazione del templatetag di Django, ma solo in riferimento ai loop. Non dicono che puoi usarlo anche altrove (ovunque?).


7
Se una parola chiave come "as" può essere utilizzata con un tag modello dipende da questo tag particolare. Non è definito dallo stesso django ma da singoli tag, a seconda del loro significato. Dai un'occhiata al tag url citato per vedere come viene usato "as": code.djangoproject.com/browser/django/trunk/django/template/…
vikingosegundo

16

django.views.generic.list_detail.object_list - Fornisce tutte le variabili logiche e template per l'impaginazione (uno di quei drudgeries che ho scritto mille volte). Avvolgendolo consente qualsiasi logica di cui hai bisogno. Questa gemma mi ha risparmiato molte ore di debug degli errori off-by-one nelle mie pagine "Risultati della ricerca" e rende il codice di visualizzazione più pulito nel processo.


1
Puoi trovare la nuova versione del capitolo del libro su Viste generiche su djangobook.com/en/2.0/chapter11 . Quello sul commento va alla versione pre-1.0 di Django del libro (Django libro 1.0)
Esteban Küber,

16

PyCharm IDE è un ambiente piacevole per la codifica e soprattutto per il debug, con supporto integrato per Django.


14

Usa xml_models per creare modelli Django che utilizzano un back-end XML REST API (anziché SQL). Ciò è molto utile soprattutto quando si modellano API di terze parti: si ottiene la stessa sintassi QuerySet a cui si è abituati. Puoi installarlo da PyPI.

XML da un'API:

<profile id=4>
    <email>joe@example.com</email>
    <first_name>Joe</first_name>
    <last_name>Example</last_name>
    <date_of_birth>1975-05-15</date_of_birth>
</profile>

E ora in Python:

class Profile(xml_models.Model):
    user_id = xml_models.IntField(xpath='/profile/@id')
    email = xml_models.CharField(xpath='/profile/email')
    first = xml_models.CharField(xpath='/profile/first_name')
    last = xml_models.CharField(xpath='/profile/last_name')
    birthday = xml_models.DateField(xpath='/profile/date_of_birth')

    finders = {
        (user_id,):  settings.API_URL +'/api/v1/profile/userid/%s',
        (email,):  settings.API_URL +'/api/v1/profile/email/%s',
    }

profile = Profile.objects.get(user_id=4)
print profile.email
# would print 'joe@example.com'

Può anche gestire relazioni e raccolte. Lo usiamo ogni giorno nel codice di produzione molto usato, quindi anche se è beta è molto utilizzabile. Ha anche una buona serie di matrici che puoi usare nei tuoi test.

(Dichiarazione di non responsabilità: mentre non sono l'autore di questa biblioteca, ora sono committer, dopo aver fatto alcuni commit minori)


progetto interessante, continuate così!
Sergey Golovchenko,

Grazie, è abbastanza utile :-)
godswearhats

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.