回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我使用的是Django 2.1和PostgreSQL。
我的问题是我试图创建一个表单来同时编辑两个不同的模型。这个模型与FK有关,我看到的每个例子都与用户和概要模型有关,但是我无法复制我真正需要的。你知道吗</p>
<p>我简化的模型显示了它们的相关信息:</p>
<pre><code># base model for Campaigns.
class CampaignBase(models.Model):
....
project = models.ForeignKey(Project, on_delete=models.CASCADE)
creation_date = models.DateTimeField(auto_now_add=True)
start_date = models.DateTimeField(null=True, blank=True)
end_date = models.DateTimeField(null=True, blank=True)
....
# define investment campaign made on a project.
class InvestmentCampaign(models.Model):
....
campaign = models.ForeignKey(CampaignBase, on_delete=models.CASCADE, null=True, blank=True)
description = models.CharField(
blank=True,
max_length=25000,
)
....
</code></pre>
<p>我要创建的形式包括FK的<code>end_date</code>和<code>InvestmentCampaign</code>的<code>Description</code>。你知道吗</p>
<p>现在我有了这个<code>UpdateView</code>来编辑投资活动,我需要适应我的实际需要,这也是更新<code>CampaignBase</code>模型的原因:</p>
<pre><code>class ProjectEditInvestmentCampaignView(LoginRequiredMixin, SuccessMessageMixin, generic.UpdateView):
template_name = 'webplatform/project_edit_investment_campaign.html'
model = InvestmentCampaign
form_class = CreateInvestmentCampaignForm
success_message = 'Investment campaign updated!'
def get_success_url(self):
return reverse_lazy('project-update-investment-campaign', args=(self.kwargs['project'], self.kwargs['pk']))
# Make the view only available for the users with current fields
def dispatch(self, request, *args, **kwargs):
self.object = self.get_object()
# here you can make your custom validation for any particular user
if request.user != self.object.campaign.project.user:
raise PermissionDenied()
return super().dispatch(request, *args, **kwargs)
# Set field as current user
def form_valid(self, form):
campaign = InvestmentCampaign.objects.get(pk=self.kwargs['campaign'])
form.instance.campaign = campaign
form.instance.history_change_reason = 'Investment campaign updated'
return super(ProjectEditInvestmentCampaignView, self).form_valid(form)
def get_context_data(self, **kwargs):
project = Project.objects.get(pk=self.kwargs['project'])
context = super(ProjectEditInvestmentCampaignView, self).get_context_data(**kwargs)
context['project'] = project
return context
</code></pre>
<p>我的表格是:</p>
<pre><code>class CreateCampaignBaseForm(forms.ModelForm):
class Meta:
model = CampaignBase
fields = ('end_date',)
widgets = {
'end_date': DateTimePickerInput(),
}
def __init__(self, *args, **kwargs):
# first call parent's constructor
super(CreateCampaignBaseForm, self).__init__(*args, **kwargs)
# evade all labels and help text to appear when using "as_crispy_tag"
self.helper = FormHelper(self)
self.helper.form_show_labels = False
self.helper._help_text_inline = True
class CreateInvestmentCampaignForm(forms.ModelForm):
class Meta:
model = InvestmentCampaign
fields = ('description')
widgets = {
'description': SummernoteWidget(attrs={'summernote': {
'placeholder': 'Add some details of the Investment Campaign here...'}}),
}
def __init__(self, *args, **kwargs):
# first call parent's constructor
super(CreateInvestmentCampaignForm, self).__init__(*args, **kwargs)
# evade all labels and help text to appear when using "as_crispy_tag"
self.helper = FormHelper(self)
self.helper.form_show_labels = False
self.helper._help_text_inline = True
</code></pre>
<p>我到处都读到这样做的最佳方法是使用基于函数的视图,调用我拥有的每个表单,然后进行验证。问题是,我不知道如何用两种形式的正确对象填充字段,而且,我也不知道如何等效于get\u context\u data,也不知道如何获得<code>self</code>参数来等效于<code>get_success_url</code>(因为对于基于函数的视图,我只有request attr,所以无法访问kwargs)。你知道吗</p>
<p>我见过一些人使用<a href="https://django-betterforms.readthedocs.io/en/latest/" rel="nofollow noreferrer">django-betterforms</a>,不过,唯一的例子是auth和profile模型,我看不到用我自己的模型复制它们的方法。你知道吗</p>
<p>非常感谢。你知道吗</p>