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})
Вернуться на верх