Django добавляет ссылку на родителя при создании ребенка в отношениях "многие к одному
У меня есть две модели в отношениях один ко многим. Я редактирую родительскую запись и создаю дочернюю. Когда я создаю дочернюю запись, я не могу понять, как отправить ссылку на родителя, чтобы я мог инстанцировать ForiegnKey дочерней записи, чтобы он указывал на родителя. Может ли кто-нибудь помочь. спасибо
Родитель:
class Site(models.Model):
name = models.CharField(max_length=100)
address1 = models.CharField(max_length=100)
address2 = models.CharField(max_length=100)
postcode = models.CharField(max_length=50)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="sites")
def __str__(self):
return f"{self.name}, {self.postcode}"
def get_queryset():
return set.request.user.sites.all()
ребенок:
class Administrator(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
telephone = models.CharField(max_length=50)
email = models.EmailField()
site = models.ForeignKey(
Site, on_delete=models.CASCADE, related_name="adminstrators"
)
def __str__(self):
return f"{self.first_name} {self.last_name}, {self.email}"
Я пытаюсь указать дочернему элементу на родителя в функции проверки дочернего элемента:
def form_valid(self, form):
self.object = form.save(commit=False)
self.site = # I don't know what to put here as I have to reference to the parent Site object
self.object.save()
return HttpResponseRedirect(self.get_success_url())
Метод 1: Создайте представление для экземпляра Site
, которое будет показывать конкретный сайт по id
. Например: /site/1/
. В этом представлении создайте форму для Administrator
. Затем в методе form_valid
вы можете передать site
в качестве self.object
вот так:
def form_valid(self,form):
form.instance.site = self.get_object()
return super().form_valid(form)
Метод 2: Создайте форму для экземпляра Administrator
. Затем site
будет выпадающий список, в котором можно выбрать site
и отправить форму.
Выбирайте то, что вам больше подходит.
Наконец-то я сделал это таким образом.
В url.py была следующая строка:
path('administrator/new/<int:site_id>',views.AdministratorCreateView.as_view(),name='administrator.new'),
html связал мое детальное представление с:
<a href="{% url 'administrator.new' site.id %}" class="btn btn-primary">Create</a>
и мой класс представления выглядит следующим образом:
class AdministratorCreateView(CreateView):
model = Administrator
form_class = AdministratorForm
template_name = "register/administrator_new.html"
def get_success_url(self):
return reverse_lazy("administrator.detail", kwargs={"pk": self.object.pk})
def form_valid(self, form):
site_id = self.kwargs['site_id']
self.object = form.save(commit=False)
self.object.site = Site.objects.get(pk=site_id)
self.object.save()
return HttpResponseRedirect(self.get_success_url())
Это делает то, что я пытался сделать, спасибо всем за помощь.