Как создать выпадающий список внешних ключей в шаблоне?
Без хрустящих форм я могу создать форму следующим образом
<form method="POST">
{% csrf_token %}
<input type="text" id="name" name="name" value="{{ project.name }}"/>
</div>
Однако я не знаю, как создать выпадающий список из внешних ключей .
Я не могу использовать формы cripsy, потому что я хочу разделить поля по заголовкам, и я не использую файл forms.py, поэтому я не верю, что функция макетов будет работать.
Какова правильная методология?
Файлы настроены следующим образом
models.py
class ProjectsTypes(models.Model):
name = models.CharField(max_length=250)
def __str__(self):
return self.name
class Meta:
ordering = ('name', )
class Projects(models.Model):
fk_user = models.ForeignKey(User, on_delete=models.PROTECT)
name = models.CharField(max_length=250)
d_started = models.DateTimeField(blank=True, null=True,
fk_type = models.ForeignKey(ProjectTypes, on_delete=models.PROTECT)
notes_design = models.TextField(blank=True, null=True)
notes_process = models.TextField(blank=True, null=True)
def __str__(self):
return self.name
class Meta:
ordering = ('name', )
views.py
class Projects(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Projects
fields = ['name', 'fk_type', 'notes_design', 'notes_process']
template_name = 'projects/details_project.html'
context_object_name = 'projects'
def form_valid(self, form):
form.instance.fk_user = self.request.user
form.save()
# return super().form_valid(form)
return HttpResponseRedirect(self.request.path_info)
def test_func(self):
post = self.get_object()
if self.request.user == post.fk_user:
return True
return False
Если у вас есть доступ к form
внутри шаблона, вы можете использовать кверисет, который уже есть у него
template.html
<form method="POST">
{% csrf_token %}
<input type="text" id="name" name="name" value="{{ project.name }}"/>
<select id="id_fk_type" name="fk_type">
{% for i in form.fk_type.field.queryset.all %}
<option value="{{i.pk}}">{{i}}</option>
{% endfor %}
</select>
</div>
Если у вас нет доступа к форме, вы должны вручную передать Queryset в шаблон и просмотреть его в цикле.
Но в обоих примерах значения <option>
являются PrimaryKey
Редактировать
Попробуйте изменить функцию form_valid, чтобы вручную установить поле
def form_valid(self, form):
print(self.request.POST)
form.instance.fk_user = self.request.user
form.instance.fk_type = ProjectsTypes.objects.filter(pk=self.request.POST.get('fk_type')).first()
form.save()
# return super().form_valid(form)
return HttpResponseRedirect(self.request.path_info)