Django: создание объекта с ForeignKey из URL - PullRequest
1 голос
/ 25 апреля 2020

Я работаю над проектом Django с двумя моделями, связанными ForeignKey. Родительская модель Composition связана с дочерней моделью NoteObject с помощью id из Composition.

в models.py

class Composition(models.Model):
    id = models.AutoField(primary_key=True)
    ...

class NoteObject(models.Model):
    id = models.AutoField(primary_key=True)
    composition = models.ForeignKey(Composition, on_delete=models.CASCADE)
    ...

Однажды Композиция создана, пользователь должен иметь возможность создавать NoteObjects, которые принадлежат этой композиции. Ноты создаются следующим способом:

in views.py

class NoteCreateView(CreateView):
    model = NoteObject
    template_name = 'entry.html'
    fields = ['duration', 'pitch', 'accidental', 'octave']
    success_url = reverse_lazy('compositions')

    def get_context_data(self, **kwargs):
        kwargs['notes'] = NoteObject.objects.filter(
            composition=self.kwargs['composition'])
        return super(NoteCreateView, self).get_context_data(**kwargs)

Метод get_context_data предназначен для отображения только нот для текущей композиции. Текущая композиция получается из id композиции, являющейся частью URL, где <composition> - идентификатор композиции.

в urls.py

path('entry/<composition>/', views.NoteCreateView.as_view(), name='entry')

Когда я сохраните NoteObject, что мне нужно сделать, чтобы установить значение ForeignKey равным <composition>?

в models.py

def save(self, *args, **kwargs):
    composition_id = ????????
    self.composition_id = composition_id
    super(NoteObject, self).save(*args, **kwargs)

Как мне получить значение kwarg в CreateView равным ForeignKey при создании объекта?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Для того, чтобы эта работа работала, вам также необходимо переопределить функцию отправки.

def dispatch(self, request, *args, **kwargs):
    self.composition = Composition.objects.values_list(
        'id').filter(pk=kwargs['composition'])
    return super().dispatch(request, *args, **kwargs)

def form_valid(self, form):
    form.instance.composition_id = self.composition
    return super().form_valid(form)

Я использовал это решение и немного его изменил: CreateView Set ForeignKey из параметра Url .

0 голосов
/ 26 апреля 2020

Я думаю, что вы можете сделать это, перегрузив form_valid метод, как упомянуто в документах здесь.

class NoteCreateView(CreateView):
    model = NoteObject
    template_name = 'entry.html'
    fields = ['duration', 'pitch', 'accidental', 'octave']
    success_url = reverse_lazy('compositions')

    def form_valid(self, form):
        form.instance.composition = self.kwargs['composition']
        return super(NoteCreateView, self).form_valid(form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...