Django中的ModelForm - select没有填充适当的数据吗?

时间:2017-06-05 14:04:14

标签: python django django-models django-forms modelform

我在Django中有一个很好的显示模型 - 但它没有提取适当的信息。

出现选择下拉列表,但没有填充选项,我正在努力找出原因。

我的模特看起来像这样:

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'选项应该填充所有位置 - 目前选择是完全空的。

我一直在查看文档:在这种情况下,modelformset_factory()是否需要深入研究?

我只是不确定如何让它填充这些下拉列表。

1 个答案:

答案 0 :(得分:1)

目前,您使用CharField Trip.start_locationTrip.end_location。如果您使用选择小部件,则由您自己创建选项以填充它。

如果您对ForeignKeystart_location字段使用end_location,则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。您可能希望更新related_name模型的Mileage以包含mileage