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 не может сохранить модель.

Вот несколько обходных путей в зависимости от задач вашего приложения и того, что легко сделать для вас:

  1. Сделайте поля необязательными в модели (blank=True, null = True) & заполните их позже правильными значениями

    .
  2. Предоставить значения по умолчанию для этих полей в модели (default=...)

  3. предоставьте значения по умолчанию в шаблоне со скрытыми полями <input type="hidden" name="booking_fee_per_hour" value="????">

    .
  4. предоставляют значения по умолчанию в представлении. Например, вы можете переопределить метод 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)
Вернуться на верх