【发布时间】:2019-08-21 05:43:24
【问题描述】:
我有 2 个模型,'Candidate' 和 'Tracker' 。 如果我愿意,我想将候选人添加到跟踪器列表中。跟踪器有一些额外的字段。但是,在跟踪器模板中,我希望显示候选人的一些详细信息,例如姓名、电话等。 基本上,跟踪器页面包含添加的候选人以及一些关于他们的额外详细信息。
候选模型.py
class Candidate(models.Model):
name = models.CharField(max_length=100)
phone = models.CharField(max_length=100)
email = models.EmailField()
current_company = models.CharField(max_length=100)
current_designation = models.CharField(max_length=100)
def __str__(self):
return self.candidate_name
def get_absolute_url(self):
return reverse('candidate-detail', kwargs={'pk': self.pk})
跟踪模型.py
class Tracker(models.Model):
candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE)
position_applied = models.CharField(max_length=100)
current_CTC = models.CharField(max_length=100)
expected_CTC = models.CharField(max_length=100)
def __str__(self):
return self.position_applied
def get_absolute_url(self):
return reverse('tracker-detail', kwargs={'pk': self.pk})
views.py 文件..
class TrackerCreateView(LoginRequiredMixin, CreateView):
model = Tracker
fields = ['current_CTC', 'expected_CTC', 'position_applied', 'candidate']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
class CandidateCreateView(LoginRequiredMixin, CreateView):
model = Candidate
fields = ['name', 'phone', 'email','current_company',
'current_designation']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
到目前为止,我只是将候选者作为外键包含在内。但这需要从下拉列表中选择候选人名称,这是不切实际的。 如何在跟踪器列表中显示姓名、电话、电子邮件等?
我在候选页面上有一个按钮'添加到跟踪器'针对每个名称,它会打开 Tracker CreateView 表单并让我填写和提交详细信息。有什么方法可以自动填充形成一些肠衣? 或者我可以采取什么其他方法?也许传递主键或什么?对 urls.py 文件进行哪些更改?
注意 - 我已将候选模型中的 candidate_name 更改为 name,并将跟踪器模型中的 candidate_name 更改为 candidate,因为命名不正确且令人困惑。
但是,下面的答案仅基于以前的命名约定。
【问题讨论】:
-
注意与你的问题无关:在你的
Tracker模型中,candidate字段的related_name是错误的,它应该是trackers。这用于反向关系 (candidate.trackers),将其称为candidates会很奇怪:您必须调用candidate.candidates才能获取该候选人的所有跟踪器。 -
注 2:在 fk 的
Tracker模型中命名字段candidate_name也令人困惑。tracker.candidate_name返回一个Candidate实例,而不是候选人的姓名。Candidate中的candidate_name也让事情变得复杂。要获得名称,您现在需要执行tracker.candidate_name.candidate_name,这很难阅读并且几乎没有语法意义。你想要tracker.candidate.name。将您的字段名称更改为candidate和name。
标签: django django-models django-templates django-views