Формы Django — позволяют пользователю создавать группы для других пользователей

#django #django-models #django-views #django-forms

#джанго #django-модели #django-представления #django-forms

Вопрос:

Я пытаюсь позволить пользователю создать «клуб» (в основном группу), в который пользователь позже может добавлять пользователей.

В настоящее время он каким-то образом не создает поле в базе данных.

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

Модель

 class Club(models.Model):
    owner = models.CharField(max_length=30)
    topic = models.CharField(max_length=30)
    start = models.DateTimeField(verbose_name='start date', auto_now_add=False)
    end = models.DateTimeField(verbose_name='end date', auto_now_add=False)
    account = models.ManyToManyField(Account)
 

Число просмотров

 @login_required
def add_club(request):

    if request.method == "POST":

        form = AddClubForm(request.POST, instance=request.user)
        print(form)

        if form.is_valid():
            form.save()

        return HttpResponseRedirect(request.path_info)

    else:
        form = AddClubForm(instance=request.user)

    return render(request, 'page/club.html', {
        "form": form,
    })
 

Форма

 class AddClubForm(forms.Model):
    
    owner = forms.CharField(required=True)
    topic = forms.CharField(required=False)
    start = forms.DateField(required=False)
    end = forms.DateField(required=False)

    class Meta:
        model = Club
        fields = (
            'owner',
            'topic',
            'start',
            'end',
        )
 

Шаблон

 <form method="POST" action="">
    {% csrf_token %}
    <div class="col-md-6">
        <label class="labels">Create a club</label>
        {{ form.owner }}
        <input class="btn" type="submit" value="Add club">
    </div>
</form>
 

Комментарии:

1. Здравствуйте, у вас нет никакого сообщения об ошибке? Почему вы передаете request.user в качестве экземпляра в свою форму (это должен быть экземпляр Club)? В вашем шаблоне есть какая-либо причина {{ form.owner }} , а не только {{ form.}} ? Кроме того, отношение вашей учетной записи M2M не blank=True таково, чтобы оно ожидало этого при создании экземпляра.

2. Привет, Бриз, никаких сообщений об ошибках. Я передаю пользователя как экземпляр, поскольку мне нужно проверить, прошли ли они проверку подлинности. В моем шаблоне, который я использую {{ form.owner }} , поскольку в конечном итоге я добавлю больше полей, таких как form.topic etc. Хороший момент blank=True , хотя в базе данных все еще ничего нет.

3. Мой плохой form.owner, не видел, чтобы другие поля были отмечены как обязательные = False. blank=True, null=True Тогда в вашей модели также есть потребности в этих полях. Я все еще не понимаю instance=request.user , поскольку экземпляр должен быть объектом Club, а вашему представлению уже требуется, чтобы пользователь вошел в систему через оболочку @login_required . Вы имеете в виду, что хотите автоматически установить request.user в качестве владельца созданного клуба?

4. Решил это благодаря вашему blank=True и null=True . Большое спасибо за информацию. Когда дело доходит до instance=request.user этого, вы правы в том, что я мог бы его удалить. Однако вы не можете передать форму в качестве экземпляра.

5. Я опубликовал ответ ниже. Вы не возражаете проверить это? Также я попытался объяснить эту вещь с экземпляром, поскольку это довольно важная особенность ModelForms Django.

Ответ №1:

Поскольку это ответило на вашу проблему, я публикую решение здесь:

Вам нужно добавить blank=True, null=True в свои поля в вашей модели, иначе она ожидает их при сохранении формы.

 class Club(models.Model):
    owner = models.CharField(max_length=30)
    topic = models.CharField(max_length=30, blank=True, null=True)
    start = models.DateTimeField(verbose_name='start date', auto_now_add=False, blank=True, null=True)
    end = models.DateTimeField(verbose_name='end date', auto_now_add=False, blank=True, null=True)
    account = models.ManyToManyField(Account, blank=True)
 

Что касается instance=request.user , я полагаю, вы неправильно понимаете использование instance в ModelForm .

Если методом запроса является GET , экземпляр используется для заполнения формы модели данными из существующего объекта Club, а затем передает их в ваш шаблон для отображения информации. Если методом запроса является POST (или PUT), экземпляр представляет существующий объект Club, который вы хотите обновить данными, полученными из формы.

Обычно вам нужно использовать аргумент экземпляра в DetailView (либо для обновления, либо для извлечения одного конкретного клуба), но никогда при создании объекта.

Вот почему вам нужно удалить аргумент экземпляра в вашем views.py:

form = AddClubForm(request.POST)

Комментарии:

1. Это плюс, который я, на мой взгляд, удалил instance=request.user form = AddClubForm(request.POST, instance=request.user) . Спасибо за объяснение, я думаю, я попытаюсь «поиграть» с этим, чтобы я это понял.

2. Да, дал объяснение, но забыл указать главное ^^. Спасибо, что напомнили мне, я отредактировал свой пост.