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.
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
Es sollte eine Instanz von 'OtherModel' sein, ja? – slurms
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