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

时间:2017-06-19 13:34:13

标签: python django

我见过类似的问题,唉它没有得到回答。 我有一个应用程序,其中包含一个名为SubEntry的条目(如博客条目)。我希望用户能够报告SubEntries(即按下“报告”按钮,填写一些字段,应用程序向管理员发送电子邮件,在db中保存报告很好):

流程应该是这样的:在视图EntryDetails(url:/ entry / entry-title /)中,用户可以单击SubEntry部分。模态打开,子模式在模态中显示为放大,在“报告子项”下面有一个按钮/链接。然后可以单击“报告子项”按钮并显示两个字段 - 报告原因和报告者的联系详细信息(这里我只是切换字段的可见性)。我设法显示表单(使用get overriden - 覆盖get_form_kwargs会导致错误No Entry with the title)但是条目或其属性不会显示...

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

任何想法,建议? 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

2 个答案:

答案 0 :(得分:0)

您使用ReportSubEntry的当前模型非常完美,无需更改。

在您的forms.py ReportEntryForm中,您必须使用relatedfields才能正确序列化数据。没有必要覆盖任何东西。当用户点击报告子条目时,您必须传递Entry模型的pk,因为需要知道报告了哪个条目。我假设,因为你成功地显示了那些存在的条目pk。当您收到带有其他两个字段的pk时,您将获得pk的相应条目,然后将该对象传递给ReportSubentry.objects.create方法。

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

答案 1 :(得分:0)

好的,所以我已经解决了这个问题。 对我有用的唯一解决方案是覆盖ReportSubentry的get方法而不调用超类的get方法:

--inline syntax
select top(10) * from (select row_number() over(order by item) as rid, * from item_table) as d where rid>10;

--cte syntax
with _numberedData as
(
    select 
        row_number() over(order by item) as rid,
        * 
    from item_table
)

select top(10)
    *
from _numberedData
where rid>10;

请随意讨论。