我见过类似的问题,唉它没有得到回答。 我有一个应用程序,其中包含一个名为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
答案 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;
请随意讨论。