Django 中的 ModelForm - select 没有填充适当的数据?
ModelForm in Django - select is not populating with appropriate data?
我在 Django 中有一个模型表单可以很好地显示 - 但它没有提取适当的信息。
select 下拉菜单出现,但没有填充选项,我正在努力找出原因。
我的模型是这样的:
class Mileage(models.Model):
start_location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='start_locations')
end_location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='end_locations')
miles = models.DecimalField(max_digits=8, decimal_places=2)
user_id = models.IntegerField(null=True)
def __str__(self):
return self.miles
class Location(models.Model):
name = models.CharField(max_length=255)
address = models.CharField(max_length=255, null=True)
latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True)
longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True)
user_id = models.IntegerField(null=True)
def __str__(self):
return self.id
class Trip(models.Model):
start_location = models.CharField(max_length=255)
end_location = models.CharField(max_length=255)
miles = models.DecimalField(max_digits=7, decimal_places=2)
user = models.ForeignKey(User, on_delete=models.PROTECT)
trip_date = models.DateTimeField('trip date')
def __str__(self):
return self.id
我的 ModelForm 如下所示:
class TripsForm(ModelForm):
class Meta:
model = Trip
fields = ['start_location', 'end_location', 'miles', 'trip_date']
widgets = {
'start_location': forms.Select(
attrs={
'class': 'form-control',
'id': 'start_location'
}
),
'end_location': forms.Select(
attrs={
'class': 'form-control',
'id': 'end_location'
}
),
'miles': forms.NumberInput(
attrs={
'class': 'form-control',
'id': 'miles',
'readonly': 'readonly'
}
),
'trip_date': forms.TextInput(
attrs={
'class': 'form-control monthpicker datepicker',
'id': 'trip_date'
}
),
}
在我看来,我是这样称呼它的 view.py
:
# Create trip
def trip_create(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
form = TripsForm(request.POST)
# check whether it's valid:
if form.is_valid():
# Save the form -- will handle this all later
trip.save()
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = TripsForm()
# Return to trips with list of date
return render(request, 'trips/create.html', {'form': form})
'start_locations' 和 'end_locations' select 应填充所有位置 - 目前 select 完全是空的。
我一直在查看文档:在这种情况下 modelformset_factory()
是否需要深入研究?
我只是不确定如何继续让它填充那些下拉菜单。
目前您正在为 Trip.start_location
和 Trip.end_location
使用 CharField
。如果您使用 select 小部件,则由您创建选项来填充它。
如果您对 start_location
和 end_location
字段使用 ForeignKey
,那么 Django 会为您填充选项。
class Trip(models.Model):
start_location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='trip_start_locations')
end_location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='trip_end_locations')
对模型进行更改后,您必须先进行迁移,然后再迁移。
请注意,我已将 trip
包含在 related_name
中,因为相关名称用于将您从 Location
模型带回 Trip
。您可能想要更新 Mileage
模型的 related_name
以包含 mileage
.
我在 Django 中有一个模型表单可以很好地显示 - 但它没有提取适当的信息。
select 下拉菜单出现,但没有填充选项,我正在努力找出原因。
我的模型是这样的:
class Mileage(models.Model):
start_location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='start_locations')
end_location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='end_locations')
miles = models.DecimalField(max_digits=8, decimal_places=2)
user_id = models.IntegerField(null=True)
def __str__(self):
return self.miles
class Location(models.Model):
name = models.CharField(max_length=255)
address = models.CharField(max_length=255, null=True)
latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True)
longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True)
user_id = models.IntegerField(null=True)
def __str__(self):
return self.id
class Trip(models.Model):
start_location = models.CharField(max_length=255)
end_location = models.CharField(max_length=255)
miles = models.DecimalField(max_digits=7, decimal_places=2)
user = models.ForeignKey(User, on_delete=models.PROTECT)
trip_date = models.DateTimeField('trip date')
def __str__(self):
return self.id
我的 ModelForm 如下所示:
class TripsForm(ModelForm):
class Meta:
model = Trip
fields = ['start_location', 'end_location', 'miles', 'trip_date']
widgets = {
'start_location': forms.Select(
attrs={
'class': 'form-control',
'id': 'start_location'
}
),
'end_location': forms.Select(
attrs={
'class': 'form-control',
'id': 'end_location'
}
),
'miles': forms.NumberInput(
attrs={
'class': 'form-control',
'id': 'miles',
'readonly': 'readonly'
}
),
'trip_date': forms.TextInput(
attrs={
'class': 'form-control monthpicker datepicker',
'id': 'trip_date'
}
),
}
在我看来,我是这样称呼它的 view.py
:
# Create trip
def trip_create(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
form = TripsForm(request.POST)
# check whether it's valid:
if form.is_valid():
# Save the form -- will handle this all later
trip.save()
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = TripsForm()
# Return to trips with list of date
return render(request, 'trips/create.html', {'form': form})
'start_locations' 和 'end_locations' select 应填充所有位置 - 目前 select 完全是空的。
我一直在查看文档:在这种情况下 modelformset_factory()
是否需要深入研究?
我只是不确定如何继续让它填充那些下拉菜单。
目前您正在为 Trip.start_location
和 Trip.end_location
使用 CharField
。如果您使用 select 小部件,则由您创建选项来填充它。
如果您对 start_location
和 end_location
字段使用 ForeignKey
,那么 Django 会为您填充选项。
class Trip(models.Model):
start_location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='trip_start_locations')
end_location = models.ForeignKey(Location, on_delete=models.PROTECT, related_name='trip_end_locations')
对模型进行更改后,您必须先进行迁移,然后再迁移。
请注意,我已将 trip
包含在 related_name
中,因为相关名称用于将您从 Location
模型带回 Trip
。您可能想要更新 Mileage
模型的 related_name
以包含 mileage
.