2017-06-05 116 views
1

我有一个Django中的模型表单很好地显示 - 但它并没有提供适当的信息。Django中的ModelForm - 选择没有填充适当的数据?

出现选择下拉菜单,但没有填充选项,我正在努力弄清楚原因。

我的模式是这样的:

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'选项应该填入所有位置 - curren这些选择完全是空的。

我一直在寻找通过文档:是否modelformset_factory()是在这种情况下挖掘更多的东西?

我只是不知道如何着手让它填充这些下拉菜单。

+0

可以肯定的是,数据库中有一些位置,对不对? – FamousJameous

+0

您可以提供您的view.py – marin

+0

是@FamousJameous - 数据库中大约有27个位置。我将很快更新view.py – Hanny

回答

1

当前您使用的CharFieldTrip.start_locationTrip.end_location。如果您使用选择小部件,您可以创建选项来填充它。

如果您的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') 

在模型中进行更改后,您必须进行迁移,然后进行迁移。

请注意,我已经包括在related_nametrip,因为相关的名称是用来把你从Location模型回Trip。您可能需要将related_name更新为您的Mileage型号,以包含mileage

+0

出于好奇 - 有没有一种方法,我可以指定下拉菜单显示位置名称,而不是位置的ID? – Hanny

+0

请参阅[此问题](https://stackoverflow.com/questions/6754776/django-change-select-items-display/6754902#6754902)。 – Alasdair