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())

Это делает то, что я пытался сделать, спасибо всем за помощь.

Вернуться на верх