2010-03-13 18 views
20

ilk iki paragraf jenerik görünümleri hayatımı kolaylaştırmak, daha az monoton yapmak ve kadınlara bana daha cazip hale gerekiyor açıklamak (ben uydurdum sonuncusu):Düz İngilizce'de, Django genel görünümleri nelerdir? Bu sayfanın

https://docs.djangoproject.com/en/1.4/topics/generic-views/

ben Hayatımı geliştirmek için her şeyim, ama genel görüşler gerçekte ne yapıyor? Anlaşılandan daha fazla kafa karıştırıcı bir sürü vızıltı var gibi görünüyor.

jenerik görünümleri Ruby on Rails iskele benziyor mu? Introdaki son mermi noktası bunu belirtiyor gibi görünüyor. Bu doğru bir beyan mı?

cevap

19

Django genel görünümleri, yalnızca web uygulamalarında çok yaygın olan şeyleri görüntüleyen işlevlerdir (normal eski python işlevleri).

Oluşturduğunuz uygulama türüne bağlı olarak, çok basit görünümler yazmanızı önleyebilirler. Örneğin, direct_to_template genel görünümü, RequestContext ile bir şablon oluşturur (bu, şablonun geçerli kullanıcı, vb. Gibi istek üzerine bilgi erişimine sahip olduğu anlamına gelir). Basit bir örnek olarak

, bu gibi şeyler yazmaktan gidebilir:

# urls.py 
url('^some-url/$', some_view) 

# views.py 
def some_view(request): 
    return render_to_response('template_name.html', context_instance=RequestContext(request)) 

için sadece bu:

# urls.py 
url('^some-url/$', direct_to_template, {'template': 'template_name.html'}) 

# views.py doesn't need any code for this view anymore 

örneğin "gösteren gibi ortak eylemler için daha karmaşık jenerik görünümleri vardır modellerin listesi "veya" db'ye model ekleme ".

Ayrıca, genel görünümler yalnızca işlevler olduğundan, genel durumlardan biraz farklı olan bir şeye ihtiyacınız olduğunda bunları "işin çoğu" yapmak için kendi görünümünüzün işlevleri içinde çağırabilirsiniz.

+2

sayesinde TM: Burada


formu sınıf ikisi de payıdır. Bunu belgelere eklemeliler :). Yine de genel görünümlerde satılmadım. Direct_to_template içeren örneğiniz fazla kod (2 satır) kaydetmez ve yine de şablonu manuel olarak belirtmeniz gerekir. Kötü olan bölüm, uygulamanızı anlamak için biraz daha zorlaştırmasıdır, çünkü bu basit görevi gerçekleştirmek için gerekli olandan daha çok Django'yu bilmem gerekiyor. – allyourcode

+1

@allyourcode Daha karmaşık görünümlerle çok daha fazla kod kaydetmek için durursunuz, çok hızlı bir örnek seçtim. Ayrıca, modellerde çalışan bu görünümler için, bir adlandırma kuralı temelinde bir şablonu otomatik olarak seçer (veya sözleşmeyi izlemek istemiyorsanız geçersiz kılınabilir). Daha fazla örnek için http://docs.djangoproject.com/en/1.1/ref/generic-views/ adresine bakın. Bu görüntülerin bazılarını sıfırdan yazmanızı ve sonra karşılaştırmanızı tavsiye ederim. Hiçbiri devasa ve karmaşık değil, yazmak ve hata ayıklamak için sadece bir şey daha az. –

+0

Tekrar teşekkürler, TM. Zaten Django'nun geliştirme sürümü için doktora bakıyordum. – allyourcode

2

İkinci sorunuzu yanıtlamak için: Hayır, genel görünümler RoR'daki iskele ile ilgili değil. İsminden de anlaşılacağı gibi iskele, kod üretimine benzer. Genel görünümler başka bir şeydir.

Genel görünümümün temel kullanımı, çok temel render_to_response işlevlerinin daha üst düzey bir yerine geçmesidir.

def my_view(request): 
    return render_to_response('my_template.html') 

Ama bu çok temel: Bu render_to_response ile basit bir görünüm yazabilirim nasıl! Örneğin, açık bir şekilde iletmediğiniz sürece, şablon istek bağlamına erişemez.

Ben böylece yerine genel görünümünü kullanmayı tercih:

def my_view(request): 
    return direct_to_template(request, template='my_template.html') 

Şimdi istek bağlam geçirilir! Ve bu sadece bir başlangıç. Örneğin, listeleri veya ayrıntılı görünümleri görüntülemek istediğinizde genel görünümler kullanışlı olur. Veritabanını sorgulamayı ve kullanıcıyı aralarında mesajlaşmayı yönetecekler.

Genel görünümler, bir görünümden yanıt oluşturmanıza yardımcı olacak yüksek düzey işlevlerdir.

+0

Genel görünümler kod oluşturmayı içerebilir, ancak benzer bir rol oynarlar. Rails'in eski bir versiyonunda, bir kontrolörde iskele ilan etmek mümkündü (Django jargonunda görüntüle). Bu, denetleyiciye, kullanıcının ilgili modelde temel CRUD işlemlerini gerçekleştirmesine izin verecek bir dizi yönteme dinamik olarak verecekti. – allyourcode

+0

"Genel görünümler ** kod üretmeyi içermeyebilir, ancak benzer bir rol oynarlar" demişsinizdir. Söylediğim gibi, genel görüşün ... görüşten bir yanıt oluşturmaya yardımcı olduğunu söylemeyi tercih ederim. Bir olası uygulama CRUD işlemleri içindir. Ancak, kodun geri kalanını hala yazmanız gerektiğini unutmayın, bu yüzden kesinlikle iskele değildir. Ayrıca, yanıt üretimlerinde yinelemeniz varsa, kendi genel görünümlerinizi yazmak mantıklı olacaktır. –

+0

+1, işlevinizde genel bir görünümün nasıl kullanılacağını belirtmek için. Esp. "update_object" görünümünü çağırmak, onu benim için her iki dünyanın en iyisi yapar: açık kod ve hala kısa. – vdboor

4

Jenerik görünümleri çok daha kısa kod yazmak için izin verir.

karşılaştırın:

from django.http import HttpResponse, HttpResponseRedirect, Http404 
from django.shortcuts import render_to_response, get_object_or_404, redirect 
from myapp.models import Context 

def edit(request, item_id): 
    object = get_object_or_404(Context, pk=item_id) 

    if request.method == 'POST': 
     form = ContextForm(request.POST, instance=object) 
     if form.is_valid(): 
      form.save() 
      return redirect('myapp-context-index') 
    else: 
     form = ContextForm(instance=object) 

    return render_to_response("myapp/context/edit.html", {'object': object, 'form': form}) 

ile: normal görünümler gibi

from django.core import urlresolvers 
from django.views.generic.create_update import update_object 
from myapp.models import Context 

def edit(request, item_id):  
    return update_object(request, 
     object_id=item_id,    
     form_class=ContextForm,    
     template_name="myapp/context/edit.html", 
     post_save_redirect=urlresolvers.reverse("myapp-context-index") 
    ) 

, sadece normal fonksiyonları vardır. İsterseniz, bu kullanımı biraz daha açık olarak bulabilirsem, görünümü tamamen URLconf içinde yapılandırmak mümkündür.

BONUS olarak, aynı zamanda almak:

  • Giriş kimlik doğrulaması kontrolleri django.contrib.messages den
  • Başarı durum mesajı (login_required=True geçmesi).
  • Hataların kontrol edilmesi için daha az kod.
  • form_class yerine model parametresi sağladığınızda varsayılan ModelForm.

template_name, "appname/model_form.html" varsayılanına sahiptir, ancak bu benim için biraz fazladır.

class ContextForm(forms.ModelForm): 
    """The form for a context""" 
    class Meta: 
     model = Context 
     exclude = ('collection',) 

    def save(self, commit=True): 
     """Overwritten save to force collection_id to a value""" 
     model = super(ContextForm, self).save(commit=False) 
     model.collection_id = 1 
     if commit: 
      model.save() 
     return model 
İlgili konular