2009-08-06 12 views
3

Ich habe ein Modell namens Project, das ein m2m Feld Benutzer hat. Ich habe ein Aufgabenmodell mit einem FK-Projekt. Und es hat ein Feld assigned_to. Wie kann ich die Auswahl von assigned_to nur auf die Benutzer des aktuellen Projekts beschränken?Limit-Optionen zu

Antwort

0

Sie müssen ein custom form for the admin erstellen.

Ihr Formular sollte eine ModelChoiceField enthalten, in der Sie einen queryset-Parameter angeben können, der die verfügbaren Optionen definiert. Dieses Formular kann ein ModelForm sein.

(im folgenden Beispiel wird davon ausgegangen Benutzer haben ein FK-Modell zu Ihrem Projekt)

forms.py

from django import forms 

class TaskForm(forms.ModelForm): 
    assigned_to = forms.ModelChoiceField(queryset=Users.objects.filter(user__project=project)) 

    class Meta: 
     model = Task 

Dann das Formular auf der Modeladmin zuweisen.

admin.py

from django.contrib import admin 
from models import Task 
from forms import TaskForm 

class TaskAdmin(admin.ModelAdmin): 
    form = TaskForm 
admin.site.register(Task, TaskAdmin) 
+0

Meine Benutzer keine FK mein Projekt Modell haben. Aber mein Projektmodell hat einen M2M-Feldbenutzer. – swoei

+2

Die Idee ist die richtige, aber der angegebene Code funktioniert nicht, da die 'Projekt'-Variable nicht definiert ist. Die rechte Seite eines queryset-Parameters muss ein tatsächlicher Wert oder eine Variable sein, kein Feld im Modell. Sie müssen hier die Methode "__init__" des Formulars überschreiben, damit dies funktioniert. –

1

Man könnte dies eine andere Art und Weise tun, diese raffinierte Form Fabrik Trick.

def make_task_form(project): 
    class _TaskForm(forms.Form): 
     assigned_to = forms.ModelChoiceField(
       queryset=User.objects.filter(user__project=project)) 

     class Meta: 
      model = Task 
    return _TaskForm 

aus Ihrer Sicht Code Dann können Sie etwas tun:

project = Project.objects.get(id=234) 
form_class = make_task_form(project) 
... 
form = form_class(request.POST)