3

新しい Django 開発者に役立つ基本的な質問があります。

Django で独自の UserProfile を作成しました。この UserProfile には、「タイプ」と呼ばれる特定のフィールドがあります。このフィールドは 2 つの値を持つことができます (今までは、将来的にはさらに増える可能性があります): 男性 - M / 女性 - F:

from django.contrib.auth.models import User

GENDER = (
    (M, 'Male'),
    (F, 'Female'),
)

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    type = models.CharField( max_length=2,
                             choices=GENDER,
                             default='F')

基本的には、アクセスを制限したり、ユーザーのタイプに応じてページ コンテンツを調整したりするために、アクセスを許可したかったのです。これまでは、ビューでユーザー タイプをテストしてからページを処理するという、非常に基本的で初心者向けのアプローチを使用しました。

def OnePage(request):
    if request.user.type == 'M':
        ....
    else if request.user.type =='F':
        ....

次に、ユーザー タイプに応じてレンダリングされるテンプレートを調整する必要があります。男性ユーザーは、女性ユーザーと同じプロファイル ページを持っていません。

これを行うためのより良い方法があると確信していますが、Django の初心者として、Django のすべての可能性にかなり迷っています。したがって、これを実装するためのベスト プラクティスがあれば教えてください (もちろん、すべてのビューで使用できる DRY コードが必要です!)

ご協力ありがとうございました。

4

4 に答える 4

7

アクセスを制限するには、ユーザー パス テストデコレータを使用します。

from django.contrib.auth.decorators import user_passes_test

male_only = lamda u: u.type == 'M'
female_only = lamda u: u.type == 'F'


@user_passes_test(male_only)
def myfunc(request):
   pass

@user_passes_test(female_only)
def myotherfunc(request):
   pass
于 2012-09-26T10:23:56.240 に答える
3

解決策の 1 つは、ユーザーの種類に応じて基本テンプレート名を変更することです。

@render_to('some_template.html')
def some_view(request):
    base_template = 'base_%s.html' % request.user.profile.type
    # …
    return {
        'base_template': base_template,
    }

そしてあなたのテンプレートで:

{% extends base_template %}
{% block some-block %}
…
{% endblock %}

すべてのビューでこれを行う必要がある場合は、ミドルウェアを使用してこの値を設定できます。

于 2012-09-26T10:02:03.783 に答える
0

やりたいことに応じて、性別ごとに非常に異なる html を使用する必要がある場合は、次のアプローチを試すことができます。

def gender_filter(func):
    def _view(request,*args,**kwargs):
        res=func(request,*args,**kwargs)
        if request.user.get_profile().type=='F':
            res.template_name='template_f.html'
            res.context_data['gender']='female'
        elif request.user.get_profile().type=='M':
            res.template_name='template_m.html'
            res.context_data['gender']='male'
        return res.render()
    return _view

@gender_filter
def my_view(request):
    t=TemplateResponse(request,'template_f.html',{...})
    return t

したがって、ビューで Http 応答を返す代わりに、それらにTemplateResponseオブジェクトを返させ、デコレーターを使用してテンプレートを変更し、一般的なコンテキストに追加して、それらを HttpResponse に変換することができます。

または、許可チェックのようなもの:

def gender_only(gender):
    def _dec(func):
        def _view(request,*args,**kwargs):
            if request.user.get_profile().type==gender
                return func.render(request,*args,**kwargs)
            else:
                raise Exception("You do not have the right gender")
        return _view
    return _dec

@gender_only('F')
def my_view(request):
    ...
    return render_to_response('template.html',{...},context_instance=RequestContext(request))
于 2012-09-26T10:32:49.920 に答える
0

ユーザーに追加データを追加するには、次を参照してください。

ユーザーに関する追加情報の保存

次に、プロファイルをコンテキストに追加すると、テンプレートで {{profile}} 変数を使用できます

{% if profile.type == "F" %}
    blah, blah
{% else %}
    blah, blah
{% endif %}
于 2012-09-26T09:37:16.773 に答える