POST к просмотру не обновляет базу данных
У меня есть представление, которое я хочу иметь возможность добавить событие в проект. Есть 2 модели, одна для Project
и одна для Event
.
Модель проекта
class Project(models.Model):
project_name = models.CharField(max_length=50, blank=False, unique=True)
project_website = models.URLField(max_length=50, blank=True)
project_description = models.TextField(blank=True)
ckeditor_classic = models.TextField(blank=True)
project_category = models.CharField(max_length=15, blank=True)
project_type = models.CharField(max_length=10, blank=True)
project_platform = models.CharField(max_length=25, blank=True)
project_marketcap = models.IntegerField(blank=True, null=True)
project_stage = models.CharField(max_length=25, blank=True)
project_blockchain = models.CharField(max_length=25, blank=True)
project_investors = models.ManyToManyField(Investor, blank=True)
project_developers = models.ManyToManyField(Developer, blank=True)
def __str__(self):
return str(self.project_name)
Модель события
class Event(models.Model):
project = models.ForeignKey(Project, to_field='project_name', on_delete=models.CASCADE)
event_name = models.CharField(max_length=100)
event_date = models.DateTimeField(blank=True)
event_url = models.URLField(max_length=100, blank=True)
def __str__(self):
return str(self.event_name)
Событие имеет отношение ForeignKey
к проекту.
когда я перехожу на страницу проекта для конкретного проекта, я нажимаю кнопку, позволяющую мне создать событие.
Название проекта предварительно заполняется с помощью этого URL
path('apps/add_event/<int:project_id>', view=AddEvent, name="add_event"),
Это создает простую форму, которой я могу присвоить имя и дату события, но когда я POST
(Submit), данные не добавляются в базу данных.
Я получаю POST
в логах
[25/Nov/2021 21:37:11] "POST /apps/add_event/3 HTTP/1.1" 302 0
Я не могу понять, почему данные не обновляются в базе данных?
Form.PY
class addEventForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(addEventForm, self).__init__(*args, **kwargs)
class Meta:
model = Event
fields = '__all__'
View.py
@login_required
def AddEvent(request,project_id):
project = Project.objects.get(pk=project_id)
form = addEventForm(request.POST or None, instance=project)
if form.is_valid():
form.save()
return redirect('http://127.0.0.1:8000/')
return render(request, 'pages/add_event.html', {'project': project, "form": form})
Мне интересно, если эта строка form = addEventForm(request.POST or None, instance=project)
должна быть instance=event
Я добавил event = Event.objects.all()
и изменил instance=event
, но выдает ошибку:
AttributeError at /apps/add_event/4
'QuerySet' object has no attribute '_meta'
Так что я в некоторой растерянности. Есть идеи?
Вы не можете сделать project
экземпляром: ваша форма работает на Event
. Используя instance=project
, вы позволяете форме редактировать атрибуты, принадлежащие event
, например event_name
, но они не будут сохранены в базе данных, так как Project
не имеет столбца event_name
.
Таким образом, представление должно принимать request.POST
в качестве данных, и мы устанавливаем .project
из Event
, обернутых в форму с:
from django.shortcuts import get_object_or_404
@login_required
def AddEvent(request,project_id):
project = get_object_or_404(Project, pk=project_id)
if request.method == 'POST':
form = addEventForm(request.POST)
if form.is_valid():
form.instance.project = project
form.save()
return redirect('http://127.0.0.1:8000/')
else:
form = addEventForm()
return render(request, 'pages/add_event.html', {'project': project, "form": form})