#python #django
#python #django
Вопрос:
У меня возникла проблема с формой, которая не сохраняется в datebase.
views.py
...
@login_required
def create_task(request):
if request.method == 'POST':
form = CreateTaskForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return redirect('index')
else:
form = CreateTaskForm()
context = {'form': form}
return render(request, 'tasks/task_form.html', context)
...
forms.py
from django import forms
from .models import Task
class CreateTaskForm(forms.ModelForm):
class Meta:
model = Task
fields = (
'name',
'end_date',
'description',
)
Это проблема с представлением create_task или CreateTaskForm?
Комментарии:
1. Почему вы передаете пользовательский экземпляр form в модель задачи? В чем ошибка?
2. Помимо неправильного экземпляра, который вы передаете, вы видите какие-либо ошибки? Если нет, вы уверены, что ваш
if request.method == POST
код вызван? Можете ли вы установить точку останова внутри if и проверить, что вы достигли этой точки?3. Вам также следует добавить
Task
модель
Ответ №1:
Проблема заключается в представлении create_task:
if request.method == 'POST':
form = CreateTaskForm(request.POST)
if form.is_valid():
# if you have user in your model task make commit to false then set the user
form.save(commit=false)
form.user = request.user
#if not save directly you form
form.save()
return redirect('index')
затем проверьте, соответствует ли ваш URL:
path('create_task', create_task, name="create_task")
Комментарии:
1.
form.user
не является частью формы, и они не совместно использовали модель… откуда вы знаете, чтоuser
это часть модели?2. проблема в его экземпляре =request.user, вам не нужно его добавлять. Я добавил form.user, чтобы указать пользователя, существует ли он в вашей модели в качестве внешнего ключа
3. Верно, что ‘instance=request.user’ недопустим, но добавление ‘form.user’ без ведома одинаково проблематично
4. Да, но если модель задачи не содержит ‘user foreignkey’, не используйте ‘form.user’, сохраните вашу форму напрямую ‘form.save()’.
5. Можете ли вы добавить свой model.py ?
Ответ №2:
Во-первых, поскольку вы используете POST
, то есть создаете, нет необходимости в instance=request.user
— который используется для сравнения предыдущих данных с новыми данными, предоставленными формой. Глядя на вашу форму, не похоже, что она имеет какое-либо отношение к пользователю.
Во-вторых, вы не отображаете и не возвращаете ошибки формы. Таким образом, это может привести к молчаливому сбою проверки на уровне модели без вашего ведома. Попробуйте добавить возврат с ошибками формы.
@login_required
def create_task(request):
form = CreateTaskForm()
if request.method == 'POST':
form = CreateTaskForm(request.POST)
if form.is_valid():
form.save()
return redirect('index')
context = {'form': form}
return render(request, 'tasks/task_form.html', context)
Вы можете заглянуть form.errors
на сторону шаблона, чтобы увидеть ошибки проверки.