Django: Объект не сохраняется в БД при отправке формы с помощью CreateView
У меня есть CreateView для создания исполнителей, но при отправке формы ничего не происходит.
models.py
class Artist(models.Model):
name = models.CharField(max_length=222, unique=True)
slug = models.SlugField(unique=True, null=True)
age = models.PositiveIntegerField(null=True,blank=True)
location = models.CharField(max_length=222, null=True, blank=True)
bio = models.TextField(null=True,blank=True)
booking_fee_per_hour = models.PositiveIntegerField(verbose_name="Booking Fee per hour")
def __str__(self):
return self.name
views.py
class ArtistsAddView(views.CreateView):
template_name = 'add_artist.html'
model = Artist
fields = '__all__'
success_url = '/'
templates -> add-artist.html
<form method="post" action="{% url 'artist add' %}">
<p>{{ form.name.label_tag }} {{ form.name }}</p>
<p>{{ form.age.label_tag }} {{ form.age }}</p>
<p>{{ form.location.label_tag }} {{ form.location }}</p>
<p>{{ form.bio.label_tag }} {{ form.bio }}</p>
<input type="hidden" name="next" value="{{ next }}">
<button>Submit</button>
{% csrf_token %}
</form>
Я намеренно скрыл 2 поля: slug и booking_fee_per_hour. Я хотел бы сделать их доступными только для администраторов.
Если я пишу:
<form method="post" action="{% url 'artist add' %}">
{{ form.as_p }}
<input type="hidden" name="next" value="{{ next }}">
<button>Submit</button>
{% csrf_token %}
</form>
тогда исполнитель сохраняется в БД, но и обычный пользователь может видеть slug и booking_fee_per_hour.
Не могли бы вы мне помочь?
Я думаю, что поскольку шаблон add-artist.html
не включает некоторые поля, которые являются обязательными, как slug & booking_fee_per_hour
(нет blank=True, null = True
), общий CreateView
не может сохранить модель.
Вот несколько обходных путей в зависимости от задач вашего приложения и того, что легко сделать для вас:
Сделайте поля необязательными в модели (
.blank=True, null = True
) & заполните их позже правильными значениямиПредоставить значения по умолчанию для этих полей в модели (
default=...
)предоставьте значения по умолчанию в шаблоне со скрытыми полями
.<input type="hidden" name="booking_fee_per_hour" value="????">
предоставляют значения по умолчанию в представлении. Например, вы можете переопределить метод
.post
класса и предоставлять значения на лету при сохранении. https://docs.djangoproject.com/en/4.1/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView
class ArtistsAddView(views.CreateView):
template_name = 'add_artist.html'
model = Artist
fields = '__all__'
success_url = '/'
def post(request, *args, **kwargs)
post_data = request.POST.copy() # make post data mutable
# Add the needed data
post_data['booking_fee_per_hour'] = ...
...
# save
request.POST = post_data
super().post(request, *args, **kwargs)