Создание и обновление формы модели Django
У меня есть модель формы под названием Record Category, которая имеет только поле name на моих 2 страницах 1.record_category/create/ 2.record_category/update/ как я могу написать свой formview для обновления и создания?
models.py
class RecordsCategory(models.Model):
name = models.CharField(max_length=255, blank=True)
views.py
class RecordCategoryView(FormView):
?
Используйте django generic UpdateView и CreateView.
views.py
class RecordCategoryCreateView(CreateView):
model = RecordsCategory
fields = ['field name']
повторите то же самое с UpdateView, убедившись, что вы сделали правильные изменения по пути.
Что ж, давайте рассмотрим сценарий, в котором мы создаем RecordsCategory и обновляем/редактируем RecordsCategory используя формы Django.
Предположим, что у вас есть определенная модель следующего вида:
class RecordsCategory(models.Model):
name = models.CharField(max_length=255, blank=True)
Теперь добавим формы:
class RecordsCategoryForm(forms.ModelForm):
class Meta:
model = RecordsCategory
fields = '__all__'
def save(self):
record_category = super(RecordsCategoryForm, self).save(commit=False)
record_category.save()
return record_category
Если вы обратите внимание на метод сохранения, мы сначала пытаемся получить объект категории записи без сохранения его в БД (через commit=False). Это делается для того, чтобы убедиться, что приложение не вызовет ошибку IntegrityError (что означает, что мы пытаемся сохранить в БД без ввода/заполнения обязательных полей). Затем мы сохраняем его в базу данных.
Добавим представления для create new record category:
from django.views.generic import FormView
class NewRecordsCategoryView(FormView):
template_name = "blob/blob.html"
form_class = RecordsCategoryForm
def form_valid(self, form):
form.save()
return super(NewRecordCategoryView, self).form_valid(form)
def get_success_url(self, *args, **kwargs):
return reverse("some url name")
Мы переопределили form_valid метод NewRecordsCategoryView в save() метод, который мы переопределили выше. В частности, поскольку мы не можем получить доступ к объектам запроса в моделях/формах, нам нужно передать метод save() (мы также можем передать метод __init__ формы, это другой способ).
Теперь добавим еще одно представление для обновления объекта категории записей:
class EditRecordsCategoryView(UpdateView) #Note that we are using UpdateView and not FormView
model = RecordsCategory
form_class = RecordsCategoryForm
template_name = "blob/blob.html"
def form_valid(self, form): # here you should be redirected to the id which you want to change it.
form.save()
return super(EditRecordsCategoryView, self).form_valid(form)
def get_success_url(self, *args, **kwargs):
return reverse("some url name")
И с этими ссылками:
...
path('record_category/create/', NewUserProfileView.as_view(), name="new-user-profile"),
path('record_category/(?P<pk>\d+)/update/', EditUserProfileView.as_view(), name="edit-user-profile"),
...
И основной шаблон Django, чтобы заставить вышеупомянутые формы работать:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type=submit value="submit" />
</form>
Ссылки: