#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. Да, дал объяснение, но забыл указать главное ^^. Спасибо, что напомнили мне, я отредактировал свой пост.