24

このページの最初の2つの段落では、一般的なビューによって、私の生活が楽になり、単調さが減り、女性にとってより魅力的になると説明されています(最後の1つを作成しました)。

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

私はすべて私の人生を改善するためですが、一般的な見解は実際に何をしますか?たくさんの流行語が投げかけられているようで、説明以上に混乱しています。

一般的なビューはRubyonRailsのスキャフォールディングに似ていますか?イントロの最後の箇条書きはこれを示しているようです。それは正確な記述ですか?

4

3 に答える 3

20

Djangoのジェネリックビューは、Webアプリケーションで非常に一般的なことを行うビュー関数(通常の古いPython関数)です。

作成しているアプリの種類によっては、非常に単純なビューをたくさん作成する手間を省くことができます。

たとえば、direct_to_template汎用ビューは、RequestContext(テンプレートが現在のユーザーなどのリクエストに関する情報にアクセスできることを意味します)を使用してテンプレートをレンダリングするだけです。

簡単な例として、次のような記述から始めることができます。

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

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

これだけに:

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

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

「モデルのリストを表示する」や「データベースにモデルを追加する」などの一般的なアクションには、より複雑な一般的なビューもあります。

また、汎用ビューは単なる関数であるため、汎用ビューとは少し異なるものが必要な場合は、独自のビュー関数内でそれらを呼び出して「ほとんどの作業」を行うことができます。

于 2010-03-13T06:18:57.607 に答える
5

汎用ビューを使用すると、はるかに短いコードを記述できます。

比較:

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})

と:

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")
    )

通常のビューと同様に、それらは単なる通常の機能です。必要に応じて、URLconf でビューを完全に構成することができます。上記の使用方法がもう少し明確であることがわかります。

ボーナスとして、以下も入手できます。

  • ログイン認証チェック (pass login_required=True)
  • からの成功ステータス メッセージdjango.contrib.messages
  • エラーをチェックするコードが少なくなります。
  • の代わりにパラメータを指定ModelFormした場合のデフォルト。modelform_class

template_nameデフォルトは「appname/model_form.html」ですが、私には少し多すぎます。


両方が共有するフォームクラスは次のとおりです。

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
于 2010-06-13T20:31:27.767 に答える
2

2 番目の質問に答えるには: いいえ、一般的なビューは RoR の足場とは関係ありません。名前が示すように、スキャフォールディングはコード生成に似ています。一般的なビューは別のものです。

一般的なビューの私の主な使用法は、非常に基本的な機能のより高いレベルの置き換えとしてですrender_to_response。これは、次のように単純なビューを作成する方法ですrender_to_response

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

しかし、これは非常に基本的なことです!たとえば、明示的に渡さない限り、テンプレートはリクエスト コンテキストにアクセスできません。

したがって、代わりに一般的なビューを使用することを好みます。

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

これで、リクエスト コンテキストが渡されます。そして、それはほんの始まりです。たとえば、リストや詳細ビューを表示する場合は、汎用ビューが便利です。データベースのクエリやユーザーへのメッセージなどを管理します。

したがって、一般的なビューは、ビューからの応答を作成するのに役立つ高レベルの機能です。

于 2010-03-14T06:58:27.820 に答える