2017-04-04 6 views
-1

Ich habe ein Formular, das versucht, ein Projekt "Derzeit arbeitet an" an einer Abteilung zu registrieren.Django-Formulare: Anfangswert setzen

models.py

class Department(models.Model): 
    dept_name = models.CharField(max_length=25) 
    address = models.CharField(max_length=50) 

class Project(models.Model): 
    projectname = models.CharField(max_length=25) 
    department = models.ForeignKey(Department, null=True, blank=True, on_delete=models.SET_NULL) 

forms.py

class ProjectChoiceField(ModelChoiceField): # return a list of projects for the department form. 
    def label_from_instance(self, obj): 
     return "%s" % obj.projectname 

class SetDepartmentProjectForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(SetDepartmentProjectForm, self).__init__(*args, **kwargs) 
     if not self.fields['projectstring']: # no default set 
      self.fields['projectstring'] = ProjectChoiceField(Project.objects.filter(department=self.instance), required=False) 
     else: 
      project = Project.objects.get(projectname=self.fields['projectstring']) 
      self.fields['projectstring'] = ProjectChoiceField(Project.objects.filter(department=self.instance), required=False, initial=project.pk) 

    class Meta: 
     model = Department 
     fields = ['dept_name', 'address', 'projectstring'] 

Dies funktioniert ok für eine Drop-Down-Reihe von Projekten erstellt werden, wenn kein Wert festgelegt ist, aber wenn es bis zu einem gewissen Projektnamen Wert gesetzt - Das anfängliche Argument (Project.pk) wählt nicht das richtige Projekt als Anfangswert im Formular aus.

Antwort

-1

Sie können dies tun, indem Sie initial=self.instance.related_fieldname.pk einstellen.

+0

initial = self.instance.related_fieldname ist ein String - er hat kein pk. Willst du den PK des verwandten OtherModels nachschlagen? dh. ist das, was das Widget als Wert für das ChoiceField verwendet. – Xeberdee

+0

Es sollte eine Instanz von 'OtherModel' sein, ja? – slurms

+0

OtherModel Auswahlmöglichkeiten sind in der Tat die pk des anderen Modells - aber selbst wenn ich das richtige PK auswähle und intial = other_model.pk wähle - es ist immer noch nichts ausgewählt ---------, siehe meine Bearbeitung. – Xeberdee