如何将一个模型的主键传递到另一个模型的表单字段中?

问题描述 投票:0回答:1

我有两个模型,分别是Task和TaskNote,当我从当前Task的视图中调用表单时,我试图将当前Task的主键作为初始值输入到TaskNoteForm中。

在任务详细信息视图上,有一个指向表单的链接,用户可以在其中编写将显示在详细信息视图上的注释。我希望表单将Task实例的主键设置为TaskNote中的外键(例如,作为模型属性“ subject”)。

我的解决方案是使用'HTTP_REFERER'请求获取URL并从URL解析pk,然后将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. 是否有更好,更可接受的方法将pk传递给表单?

  3. 谢谢

我有两个模型,分别是Task和TaskNote,当试图从当前Task的视图中调用表单时,我试图将当前Task的主键作为初始值输入到TaskNoteForm中。在...

django
1个回答
0
投票

您可以通过以下方式来编辑模板,而不是编辑模板:

© www.soinside.com 2019 - 2024. All rights reserved.