СООБЩЕНИЕ для просмотра без обновления базы данных

#django

Вопрос:

У меня есть представление, которое я хочу иметь возможность добавить событие в проект. Есть 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/lt;int:project_idgt;', view=AddEvent, name="add_event"),

Это создает простую форму, в которой я могу назначить имя и дату события, но когда я POST (отправляю) данные не добавляются в базу данных.

Я действительно получаю 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'  

Так что я немного растерян. Есть какие-нибудь идеи?

Ответ №1:

Вы не можете создать project экземпляр: ваша форма работает на Event . С помощью instance=project этого вы позволяете форме редактировать атрибуты , принадлежащие к event подобным event_name , но они не будут сохранены в базе данных, так как у a 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}) 

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

1. Удивительно, в этом есть смысл. Спасибо, Виллем