Как создать выпадающий список внешних ключей в шаблоне?

Без хрустящих форм я могу создать форму следующим образом

<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)
Вернуться на верх