Здесь у меня есть модель Zipcodes для почтовых индексов, штатов и городов. У меня есть другая модель, которая имеет ключ к почтовым индексам. Здесь я хочу отобразить различные состояния в шаблоне create_person. Для этого я сделал values_list, flat = True, но для создания модели персонажа мне нужен Zipcode Pk, но values_list не дает pk, поэтому я устал использовать методы list_comprehension и ohter. которые приведены ниже в качестве комментария.
Я хочу передать набор запросов в шаблон с различными значениями состояния. Как я могу сделать это здесь?
class Zipcodes(models.Model):
zip_code = models.CharField(max_length=100, db_column='zipcode')
city = models.CharField(max_length=200)
state = models.CharField(max_length=200)
class Person(models.Model):
state = models.ForeignKey(Zipcodes, on_delete=models.CASCADE)
full_name = models.CharField(max_length=255)
views
class CreatePersonView(SuccessMessageMixin, generic.CreateView):
model = Person
fields = '__all__'
template_name = 'create_person.html'
success_url = reverse_lazy('list_persons')
success_message = 'Created Successfully.'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
all_states = Zipcodes.objects.values_list('state', flat=True).distinct()
# context['states'] = Zipcodes.objects.filter(state__in=all_states)
# context['states'] = [state for state in all_states if Zipcodes.objects.filter(state=state)]
# for state in all_states:
# context['states'] = Zipcodes.objects.filter(state=state)
return context
Шаблон
<label class="pending--option">State</label>
<select name="state" class="form-control">
{% for state in states %}
<option value="{{state.pk}}">
{{state.state}}
</option>
{% endfor %}
</select>
У меня так много данных в Zip-кодах, что он замедляется в шаблоне при передаче Zipcodes.objects.all()
Так что я использовал distinct()
>>> Zipcodes.objects.values_list('state', flat=True).distinct().count()
51
>>> Zipcodes.objects.count()
74022
>>>