Как заставить работать зависимую комбо-загрузку при использовании CreateView в django?

У меня есть модель проекта. И у меня есть модель Feature, которая имеет модель Project в качестве внешнего ключа. Теперь у меня есть модель StatusUpdate, которая имеет и модель Project, и модель Feature в качестве внешних ключей. Теперь на странице создания StatusUpdate при выборе имени проекта должны загружаться только имена функций выбранного проекта.

Модели:

class Project(models.Model):
    project_name = models.CharField(max_length=100, unique=True, verbose_name='Project Name')

from projects.models import Project
class Feature(models.Model):
    feature_name = models.CharField(max_length=100, verbose_name="Feature Name")
    project_name = models.ForeignKey(Project, verbose_name="Project Name", on_delete=models.CASCADE)

from features.models import Feature
from projects.models import Project
class Statusupdate(models.Model):
    project_name = models.ForeignKey(Project, verbose_name="Project Name", on_delete=models.CASCADE)
    feature_name = models.ForeignKey(Feature, verbose_name="Feature Name", on_delete=models.CASCADE)

forms.py

from .models import Statusupdate
class StatusupdateModelForm(forms.ModelForm):
    class Meta:
        model = Statusupdate
        fields = ['project_name', 'feature_name'']
        widgets = {'project_name': forms.Select(attrs={'class': 'form-group form-control col-sm-10 '}),
                   'feature_name': forms.Select(attrs={'class': 'form-group form-control col-sm-10'})
                   }

urls.py

from django.urls import path
from .views import (
    StatusupdateCreateView,
    StatusupdateDeleteView,
    StatusupdateListView,
    StatusupdateUpdateView,
    StatusupdateDetailView
   )

app_name = 'statusupdate'
urlpatterns = [
    path('', StatusupdateListView.as_view(), name='status-list'),
    path('create/', StatusupdateCreateView.as_view(), name='status-create'),
    path('<int:id>/', StatusupdateDetailView.as_view(), name='status-detail'),
    path('<int:id>/update/', StatusupdateUpdateView.as_view(), name='status-update'),
    path('<int:id>/delete/', StatusupdateDeleteView.as_view(), name='status-delete'),
]

StatusUpdate CreateView

from .models import Statusupdate
from .forms import StatusupdateModelForm


class StatusupdateCreateView(LoginRequiredMixin, CreateView):
    template_name = 'statusupdate/status_create.html'
    model = Statusupdate
    form_class = StatusupdateModelForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(StatusupdateCreateView, self).form_valid(form)

    def get_success_url(self):
        return reverse('statusupdate:status-detail', kwargs={'id': self.object.id})

status_create.html

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="card-body" style="margin: 0px -60px 0px 35px">
    {{ form | crispy }}
    </div>
    <div class="card-footer">
    {% if object %}
         <button type="submit" class="btn btn-info">Update Status</button>
    {% else %}
         <button type="submit" class="btn btn-info">Add Status Update</button>
    {% endif %}
    <button type="submit" class="btn btn-default float-right">Cancel</button>
    </div>
</form>

Я нашел ответ на этот вопрос, используя эту ссылку: https://simpleisbetterthancomplex.com/tutorial/2018/01/29/how-to-implement-dependent-or-chained-dropdown-list-with-django.html

Вернуться на верх