У меня есть две модели, 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>
Это работает нормально, однако ...
Я узнал, что HTTP_REFERER не является предпочтительным методом, так как его можно отключить в некоторых браузерах , Кажется, я не могу найти то, что является предпочтительным методом в документах, поэтому, если кто-нибудь может мне помочь в этом, это было бы здорово. Но также, прежде чем я потрачу много времени на то, чтобы взломать что-то еще вместе, мне интересно ...
Есть ли лучший, более приемлемый способ передачи ПК в форму ?? ?
Спасибо