#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. Удивительно, в этом есть смысл. Спасибо, Виллем