2011-10-27 8 views
2

私は臨床研究データを整理して管理するためにdjangoを使用しようとしています。これは公開される必要のない舞台裏のデータベースなので、私はadminインターフェースだけで手に入ると思います。私はプログラムすることができますが、決して前にはPythonではありません。だから、私は単純なものに執着しています。どのようにしてdjangoの関連オブジェクトに選択肢を制限できますか?

私は複数の訪問を行う患者がいます。訪問ごとに複数のスキャンが行われます。管理インターフェースでは、すべての訪問とすべてのスキャンを、各患者のページのインラインとして見ることができます。しかし、新しいスキャンを追加する際に、関連付けるための訪問の選択が、他の患者ではなく、該当する患者の訪問に限定されるようにするにはどうすればよいですか?

モデル(簡体字):任意の助け

class Patient(models.Model): 
    patient_id = models.CharField(max_length=16, primary_key=True) 
    first_name = models.CharField(max_length=64) 
    last_name = models.CharField(max_length=64) 

class Visit(models.Model): 
    patient = models.ForeignKey(Patient) 
    visit_date = models.DateTimeField() 

class Scan(models.Model): 
    patient = models.ForeignKey(Patient) 
    visit = models.ForeignKey(Visit) 
    scan_type = models.CharField(max_length=32) 

おかげで多くのことを...

答えて

1

二つの例:

まず:

class ScanInlineAdmin(admin.TabularAdmin): 
    model = Scan 
    formset = ScanInlineFormset 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "visit": 
      patient = self.get_object(kwargs['request'], Patient) 
      kwargs["queryset"] = Visit.objects.filter(patient=patient) 
     return super(ScanInlineAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

    def get_object(self, request, model): 
     object_id = request.META['PATH_INFO'].strip('/').split('/')[-1] 
     try: 
      object_id = int(object_id) 
     except ValueError: 
      return None 
     return model.objects.get(pk=object_id) 

第二:

class ScanInline(admin.TabularInline): 
    model = Scan 
    formset = ScanInlineFormset 

    def formfield_for_dbfield(self, field, **kwargs): 
     if field.name == 'visit': 
      # Note - get_object hasn't been defined yet 
      patient = self.get_object(kwargs['request'], Patient) 
      vists = Visit.objects.filter(patient=patient) 
      return forms.ModelChoiceField(queryset=visits) 
     return super(ScanInline, self).formfield_for_dbfield(field, **kwargs) 

    def get_object(self, request, model): 
     object_id = request.META['PATH_INFO'].strip('/').split('/')[-1] 
     try: 
      object_id = int(object_id) 
     except ValueError: 
      return None 
     return model.objects.get(pk=object_id) 

あなたはこのarticleは役に立ちかもしれません。私は患者のページ管理者のあなたが新しいスキャンを入力する場所を編集/表示すると仮定します。あれは正しいですか?

+0

ご意見ありがとうございます。あなたがリンクしている記事の助けを借りて今すぐできると思う。 – smwilsonau

+0

実際に最初の例を使用しようとしている人には分かりますが、Djangoを初めて使う人にとっては、kwargs ['request']はここで失敗します。 argsリストに明示的に存在するので、リクエストを使用してください。 – kungphu

1

私はformfield_for_foreignkey方法があなたのために参考になっだろうと思います。管理クラスで実装することができます。 docsを参照してください。わずかに異なる

関連する問題