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_locationTrip.end_location 使用 CharField。如果您使用 select 小部件,则由您创建选项来填充它。

如果您对 start_locationend_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.