[英]django __init__ method causing argument error
我想在基於類的視圖中使用django formset。 這是觀點,
class PeriodCreate(RequestPassingFormViewMixin, WammuCreateView):
model = Chain
template_name = 'dashboard/period_form.html'
form_class = ChainForm
def get_object(self):
chain = Chain.objects.get(pk=self.kwargs['chain_pk'])
return chain
def get_success_url(self):
return reverse('dashboard_period_list', kwargs={'chain_pk': self.object.chain.id, })
def get_context_data(self, **kwargs):
context = super(PeriodCreate, self).get_context_data(**kwargs)
return context
def get_form_kwargs(self, *args, **kwargs):
kwargs = super(PeriodCreate, self).get_form_kwargs(*args, **kwargs)
chain = get_object_or_404(Chain, pk=self.kwargs['chain_pk'])
period = Period(chain=chain)
kwargs['instance'] = period
return kwargs
def get(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
PeriodInlineFormSet = inlineformset_factory(Chain, Period,
form=PeriodInlineForm,
can_delete=True,
extra=12)
PeriodInlineFormSet.form = staticmethod(curry(PeriodInlineForm, request=request, chain=self.object))
period_formset = PeriodInlineFormSet()
return self.render_to_response(
self.get_context_data(form=form,
period_inline_formset=period_formset))
def post(self, request, *args, **kwargs):
self.object = Chain()
form = self.get_form(self.form_class)
PeriodInlineFormSet = inlineformset_factory(Chain, Period,
form=PeriodInlineForm,
can_delete=True,
extra=5)
PeriodInlineFormSet.form = staticmethod(curry(PeriodInlineForm))
if form.is_valid():
self.object = form.save(commit=False)
period_formset = PeriodInlineFormSet(request.POST, instance=self.object)
if period_formset.is_valid():
self.object.save()
period_formset.save()
return super(PeriodCreate, self).form_valid(form)
else:
return self.render_to_response(
context=self.get_context_data(form=form, period_inline_formset=period_formset))
else:
period_formset = PeriodInlineFormSet(request.POST,instance=self.object)
return self.render_to_response(
context=self.get_context_data(form=form, period_inline_formset=period_formset))
這是我的表格,
class PeriodForm(RequestPassingFormMixin, ModelForm):
class Meta:
model = Period
fields = ['start_date', 'end_date', 'year', 'description']
這是我的'RequestPassingFormMixin':
class RequestPassingFormMixin(object):
def __init__(self, request, param, *args, **kwargs):
self.request = request
self.param = param
super(RequestPassingFormMixin, self).__init__(*args, **kwargs)
但我收到以下錯誤,
TypeError at ....
__init__() takes at least 3 arguments (2 given)
這個錯誤表明我已經渲染了formset的模板,所以我也給了模板(只有我渲染了森林的部分),
<tbody>
{% csrf_token %}
{{ period_inline_formset.management_form }}
{% for period_form in period_inline_formset %}
{% for hidden in period_form.hidden_fields %}
{{ hidden }}
{% endfor %}
{{period_form.pk}}
<tr>
<td>{{ period_form.start_date }}</td>
<td>{{ period_form.end_date }}</td>
<td>{{ period_form.year }}</td>
<td>{{ period_form.description }}</td>
<td> {% if period_formset.can_delete %}
{{ period_form.DELETE }} {% endif %}</td>
</tr>
{% endfor %}
</tbody>
我不習慣使用django formset,據我所知,它不是一個formset錯誤,或者它可能是,也許我在這里缺少其他東西,但經過長時間的發現,我無法弄清楚...
您的代碼存在一些問題; 但是從實際錯誤開始 - 你只是將*args
, **kwargs
傳遞給RequestPassingFormMixin
的__init__
方法,當在定義中它需要兩個額外的位置強制參數,即request
和param
。
違規行是:
super(RequestPassingFormMixin, self).__init__(*args, **kwargs)
你甚至不需要這條線; 既然你沒有壓倒什么。 你可以刪除它。
事實上,你可以刪除整個mixin,如果這樣做的話,因為請求和參數已經可用於所有基於類的視圖。
另外,我不知道為什么你使用這個mixin作為你的表單類的父類 - 它根本不需要; 它不會做你想做的事。
您還有其他一些問題 - 您重寫方法,但不更改其功能,因此您的代碼實際上並沒有做任何不同的事情。
我有一些建議:
如果您只想要一個與表單集兼容的基於類的創建視圖,請使用django-extra-views
。
這個chain = Chain.objects.get(pk=self.request.session.get('chain_pk'))
不是在類中的任何地方設置chain
,所以它實際上丟失了。 我不確定你為什么要這條線。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.