从CreateView传递参数到模板(Django)

问题描述:

我见过类似的问题,唉,它没有得到回答。 我有一个应用程序,其功能包括一个名为SubEntry的部分(如博客条目)。我希望用户能够报告SubEntries(即按下“报告”按钮,填写一些字段,应用程序发送电子邮件给管理员,保存报告在db是很好有):从CreateView传递参数到模板(Django)

流程应该是像那样:在EntryDetails(url:/ entry/entry-title /)的视图中,用户可以点击SubEntry部分。模态打开并且子模式在扩大的模式中可视化,在“报告子模式”下面有一个按钮/链接。然后可以点击'报告子输入'按钮,出现两个字段 - 报告原因和记者的联系细节(在这里我只是切换字段的可见性)。我设法显示表单(使用getn覆盖 - 覆盖get_form_kwargs导致错误没有该条目的条目),但条目或其属性不显示...

我的问题是: 1)正在创建一个模型为报告(ReportSubEntry)一个体面的方法? 2)我似乎无法从CreateReport视图向report_subentry.html传递需要的变量(要作为正在创建的SubEntry对象的ForeignKey的Entry对象)。

任何想法,建议? Python的3.5,Django的1.10

models.py:

class ReportSubentry(models.Model): 
    Entry = models.ForeignKey('Entry') 
    details = models.CharField(max_length=100) 
    contact = models.EmailField() 

forms.py:

class ReportEntryForm(forms.ModelForm): 
    class Meta: 
     model = ReportSubEntry 
     fields = ['details', 'contact', 'project'] 

views.py:

class CreateReport(CreateView): 
    model = ReportSubEntry 
    form_class = ReportSubEntryForm 
    template_name = 'understand/report_subentry.html' 

# tried two methods to pass the variables: 
def get(self, request, *args, **kwargs): 
    self.object = None 
    title = kwargs.get('title') 
    kwargs['entry'] = get_object_or_404(Entry, title=title) 
    return super(CreateReport, self).get(request, **kwargs) 

def get_form_kwargs(self, **kwargs): 
    title = kwargs.get('title') 
    kwargs['entry'] = get_object_or_404(Entry, title=title) 
    return kwargs 

好吧,我已经解决了这个问题。 是为我工作是压倒一切的ReportSubentry的get方法,而无需调用父类的get方法唯一的解决办法:

def get(self, request, *args, **kwargs): 
    self.object = None 
    title = kwargs.get('title') 
    entry = get_object_or_404(Entry, title=title) 
    context_data = self.get_context_data() 
    context_data.update(entry=entry) 
    return self.render_to_response(context_data) 

请随时去讨论它。

您使用ReportSubEntry目前的模式是完美的,没有必要改变它。您需要使用relatedfields才能正确序列化数据。没有必要重写任何内容。当用户点击报告子条目时,您必须通过Entry模型的pk,因为它需要知道报告了哪个条目。我假设,因为你成功地显示这些pk的条目存在。当您收到包含其他两个字段的pk时,将获得pk的相应条目,然后将该对象传递给ReportSubentry.objects.create方法。

reportentry表单不应包含外键。你有两个选择。首先是删除该字段并使用ajax调用从前端传入条目的pk,或者在用户单击报表子条目时使用javascript添加包含条目pk的禁用输入字段。

+0

谢谢Arpit提供了一个快速的答案,但唉,我似乎没有得到它的权利......我还没有找到一个relatedfields属性文档,所以我只是将relatedfields属性添加到R​​eportPictureForm的Meta:relatedfields = ['details' , '联系']。没有什么改变。我已尝试related_fields,把它放在Meta外 - 没有任何工作,虽然 – fanny

+1

相关的字段是适用于序列化程序它不适用于您的情况 –

+0

啊哈,还有一件事 - SubEntry只是一个图片,我只能通过Entry( SubEntry的url是Entry的一个字段)。我需要它时,表单模板呈现(获得后)而这是我唯一缺少的时刻 - 图片(这是网址)。所以你的建议是使用JavaScript? – fanny