14

私はすべてのドキュメントにアクセスし、IRCチャネル(BTWは素晴らしいコミュニティ)にもアクセスしました。「現在のユーザー」がForeignKeyにあるフィールドでは、モデルを作成して選択肢を制限することはできないと言われました。これを例で説明しようと思います。

class Project(models.Model):
  name = models.CharField(max_length=100)
  employees = models.ManyToManyField(Profile, limit_choices_to={'active': '1'})

class TimeWorked(models.Model):
  project = models.ForeignKey(Project, limit_choices_to={'user': user})
  hours = models.PositiveIntegerField()

もちろん、そのコードは「user」オブジェクトがないため機能しませんが、それは私の考えであり、現在のユーザーがプロジェクトを持っている選択肢を制限するために、オブジェクト「user」をモデルに送信しようとしていました。私がいないプロジェクトを見たくない。

あなたが私を助けたりアドバイスをくれたりすることができればどうもありがとう、私はあなたにすべてのアプリを書いてほしくない、ただそれに対処するためのヒント。私はこれを頭の中で2日間持っています、そして私はそれを理解することができません:(

更新:解決策はここにあります:http ://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/モデルに送信request.userします。

4

6 に答える 6

6

現在のユーザーに対するこの選択肢の制限は、静的なモデル定義ではなく、要求サイクルで動的に発生する必要がある一種の検証です。

言い換えれば、このモデルのインスタンスを作成している時点でビューになり、その時点で現在のユーザーにアクセスでき、選択肢を制限できます。

次に、request.user を渡すカスタム ModelForm が必要です。ここの例を参照してください: http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/

from datetime import datetime, timedelta
from django import forms
from mysite.models import Project, TimeWorked

class TimeWorkedForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(ProjectForm, self).__init__(*args, **kwargs)
        self.fields['project'].queryset = Project.objects.filter(user=user)

    class Meta:
        model = TimeWorked

次に、あなたの見解で:

def time_worked(request):
    form = TimeWorkedForm(request.user, request.POST or None)
    if form.is_valid():
        obj = form.save()
        # redirect somewhere
    return render_to_response('time_worked.html', {'form': form})
于 2011-01-11T09:52:59.617 に答える
4

モデル自体は現在のユーザーについて何も知りませんが、モデル オブジェクトを操作するフォームのビュー (およびchoices必要なフィールドのフォーム リセット) にこのユーザーを与えることができます。

管理サイトでこれが必要な場合は、 ( http://code.google.com/p/django-granular-permissions/raw_id_adminと一緒に試すことができますが、django ですばやく動作させることはできませんでしたが、新鮮なようです1.0で十分なので...)。django-granular-permissions

django.contrib.admin最後に、管理画面で選択ボックスが必要な場合は、それ自体をハックする必要があります。

于 2008-10-02T00:47:35.650 に答える
0

あなたが何をしたいのかを完全に理解しているかどうかはわかりませんが、カスタム Managerを使用して、少なくともその一部を達成できる可能性は十分にあると思います。特に、現在のユーザーに制限を加えてモデルを定義しようとしないでください。現在のユーザーに一致するオブジェクトのみを返すマネージャーを作成してください。

于 2008-10-02T00:58:35.873 に答える
-1

うーん、私はあなたの質問を完全には理解していません。しかし、モデルを宣言するときにそれができない場合は、ユーザーオブジェクトを「送信」するオブジェクトのクラスのメソッドをオーバーライドすることで同じことを達成できる可能性があります。コンストラクターから始めることもできます。

于 2008-10-01T22:24:08.960 に答える
-5

このモデルを編集している現在のユーザーを取得する場合は、threadlocals を使用します。Threadlocals ミドルウェアは、現在のユーザーをプロセス全体の変数に入れます。このミドルウェアを取る

from threading import local

_thread_locals = local()
def get_current_user():
    return getattr(getattr(_thread_locals, 'user', None),'id',None)

class ThreadLocals(object):
    """Middleware that gets various objects from the
    request object and saves them in thread local storage."""
    def process_request(self, request):
        _thread_locals.user = getattr(request, 'user', None)

ミドルウェア クラスの使用方法については、ドキュメントを確認してください。次に、コード内のどこでも呼び出すことができます

user = threadlocals.get_current_user
于 2008-10-02T10:09:01.213 に答える