Django - Можно ли использовать один UpdateView для обновления полей на разных страницах?

Допустим, у меня есть модель Student с полями name и age, и у меня есть страница с классом DetailView, отображающим эти поля. Допустим, вместо того, чтобы иметь одну кнопку "обновить", которая приведет меня на форму для обновления всех полей моей модели сразу, я хочу иметь отдельную кнопку для каждого поля, которая приведет меня на отдельную страницу с формой для его обновления.

Я знаю, как я могу сделать это с помощью отдельного HTML файла и отдельного класса UpdateView для каждого поля, но кажется, что должен быть более чистый способ.

В первом HTML файле у меня есть две кнопки:

<a href="{% url 'update_name' pk=student.pk%}">Update name</a>
<a href="{% url 'update_age' pk=student.pk%}">Update age</a>

Во втором у меня есть форма:

<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <input type="submit" value="Submit">
</form>

Urls:

urlpatterns = [
    path('<int:pk', views.StudentDetailView.as_view(), name="detail"),
    path('update_name/<int:pk>', views.StudentUpdateView.as_view(), name="update_name"),
    path('update_age/<int:pk>', views.StudentUpdateView.as_view(), name="update_age"),
]

Просмотров:

class StudentUpdateView(UpdateView):
    model = models.Student
    template_name = 'update_student.html'

Полагаю, я ищу какой-то оператор if, который можно поместить в представление, например:

if condition:
    fields = ("name",)
elif condition2:
    fields = ("age",)

Надеюсь, это имеет смысл! Спасибо за любую помощь :)

Самый простой способ сделать это - переопределить fields в вашем файле urls.py.

urlpatterns = [
    path('<int:pk', views.StudentDetailView.as_view(), name="detail"),
    path('update_name/<int:pk>', views.StudentUpdateView.as_view(fields=['name']), name="update_name"),
    path('update_age/<int:pk>', views.StudentUpdateView.as_view(fields=['age']), name="update_age"),
]

View.as_view принимает аргументы ключевых слов, которые используются для переопределения атрибутов классов для данного вхождения.

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