Как передать первичный ключ одной модели в поле формы другой модели? - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть две модели, Task и TaskNote, и я пытаюсь получить первичный ключ текущей Задачи, введенный в качестве начального значения в TaskNoteForm, когда форма вызывается из представления текущей Задачи.

На В подробном представлении задачи есть ссылка на форму, где пользователь может написать заметку, которая появится в подробном представлении. Мне бы хотелось, чтобы форма имела первичный ключ экземпляра Задачи в качестве внешнего ключа в TaskNote (например, в качестве атрибута модели "subject").

Мое решение состояло в том, чтобы получить URL-адрес с помощью запроса HTTP_REFERER. и парсит pk из URL, затем передает pk в контекстные данные в представлении и, наконец, вводит его в качестве значения в шаблоне. Например:

# Models

class Task(models.Model):
    id = models.AutoField(
        primary_key=True)
    ...
class TaskNote (models.Model):
    ...
    subject = models.ForeignKey(
        Task,
        on_delete=models.CASCADE)
    ...

# view

def get_url_pk(self):
    url = self.request.META.get('HTTP_REFERER')
    t = url.split('/')
    pk = int(t[-1])
    return pk

class TaskNotesCreate(CreateView):
    template_name='tasknotes_new.html'
    form_class = TaskNoteForm
    model = TaskNote

    def get_context_data(self, **kwargs):
        context = super(TaskNotesCreate, self).get_context_data(**kwargs)
        context['pk'] = get_url_pk(self)
        return context

    def get_success_url(self, **kwargs):
        obj = self.object
        return reverse('task_view', kwargs={'pk': obj.subject_id})

# template
...
      <div class="form-group">
       <label for="exampleInput" class="required">
          <input type="hidden"  name="subject" value="{{ pk }}">
      </div>

Это работает нормально, однако ...

  1. Я узнал, что HTTP_REFERER не является предпочтительным методом, так как его можно отключить в некоторых браузерах , Кажется, я не могу найти то, что является предпочтительным методом в документах, поэтому, если кто-нибудь может мне помочь в этом, это было бы здорово. Но также, прежде чем я потрачу много времени на то, чтобы взломать что-то еще вместе, мне интересно ...

  2. Есть ли лучший, более приемлемый способ передачи ПК в форму ?? ?

Спасибо

1 Ответ

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

Вместо того, чтобы редактировать шаблон, вы можете сделать это следующим образом:

  1. Обновите ваш TaskNoteForm, чтобы в нем было скрытое поле ввода для значения, которое вы хотите передать (это нормально поле формы с widget=HiddenInput()).
  2. В представлении перезаписать get_initial, чтобы передать значение объекта в виде pk. Это должно выглядеть как
     def get_initial():
            initial = super().get_initial()
            initial.update(
                {"pk": self.object.pk}
            )
            return initial
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...