Django FormView不保存

时间:2013-12-31 06:16:24

标签: python django forms formview

我的表单没有保存我需要它的模型。我的表格:

class RewardForm(forms.Form):
    quantity = forms.IntegerField(max_value=10, min_value=1, label=_('quantity'), initial=1)
    reward = forms.CharField(max_length=50, label=_('reward'))
    reward_denomination = forms.ModelChoiceField(queryset=Reward_Denomination.objects.all(), widget=forms.RadioSelect)

    def clean_reward(self):
        data = self.cleaned_data.get('reward')
        try:
            reward = Reward.objects.get(reward_name=data)
        except ObjectDoesNotExist:
            raise forms.ValidationError(_('Reward does not exist'), code='invalid')
        return data

    def clean_reward_denomination(self):
        data = self.cleaned_data.get('reward_denomination')
        try:
            denomination = Reward_Denomination.objects.get(denomination=data)
        except ObjectDoesNotExist:
            raise forms.ValidationError(_('Denomination does not exist'), code='invalid')
        return data

    def save(self, request, commit=True):
        user = request.user
        data = self.cleaned_data

        'try:
            post_reward = data['reward']
            post_denomination = data['reward_denomination']
            quantity = data['quantity']
        except LookupError:
            raise Http404

        reward = Reward.objects.get(reward_name=post_reward)
        denomination = Reward_Denomination.objects.get(denomination=post_denomination)
        user_points = Points.objects.filter(affiliate__id=user.id).aggregate(total_points=Sum('points'))
        user_points = user_points['total_points']

        try:
            total_cost = (quantity * denomination.cost)
        except ArithmeticError:
            raise Http404

        quote_price = -total_cost

        if user_points >= total_cost:
                reward_order = Points.objects.create(affiliate=user, points=quote_price, from_reward=True, from_offer=False)
                status_coded = Status_Code.objects.create(short_name="Pending", name="The order is currently being reviewed", description="The order is in queue")
                redeem_order = Redeem.objects.create(affiliate=user, status_code=status_coded, quantity=quantity, reward=reward, price=total_cost)

        return reward_order

我的观点:

class Reward_Detail(DetailView):
    model = Reward
    slug_field = 'reward_slug'
    context_object_name = 'reward'
    template_name = 'omninectar/reward.html'


#Detail Stuff

class RedeemReward(SingleObjectMixin, FormView):
    template_name = 'omninectar/reward.html'
    slug_field = 'reward_slug'
    form_class = RewardForm
    model = Reward

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super(RedeemReward, self).post(request, *args, **kwargs)

    def get_success_url(self):
        return reverse('omni:reward_confirmation')

class RewardBeautify(View):
    def get(self, request, *args, **kwargs):
        view = Reward_Detail.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        view = RedeemReward.as_view()
        return view(request, *args, **kwargs)

所以我最初认为FormView将处理表单处理(验证,如果有效,则运行form.save()等)。我正在关注Django网站上的FormView, SingleObjectMixin示例。我尝试提交表单时没有收到任何错误,但也没有创建任何对象。我已经尝试定义一个运行save方法的form_valid方法,我已经尝试将它放在formview中的post方法中,等等。有人能发现错误/错误吗?谢谢!

3 个答案:

答案 0 :(得分:12)

我也是新手来查看课程,我和Django 1.6几乎有同样的问题。

你应该添加

def form_valid(self, form):
    form.save()
    return super(RedeemReward, self).form_valid(form)

方法覆盖您的RedeemReward课程。这对我有用。

如果您查看Django源代码,您会发现FormView类继承链中没有表单保存。

答案 1 :(得分:1)

我不确定这是否会有所帮助,但是我在查找显示如何从FormView模型中保存数据的代码时遇到了问题。这就是我提出的。我希望它有所帮助,你可以将它应用到你的代码中。

forms.py

class JobCreateForm(forms.Form):
    title = forms.CharField(label='Job Title', max_length=500)
    number = forms.IntegerField(label='Job Number: ')
    comps = forms.ModelMultipleChoiceField(label='Comparable Sales',      
    required=False, queryset=m.ComparableSale.objects.all())
    details = forms.CharField(label='Job Details:', max_length=200,     
    required=False, widget=forms.Textarea(attrs={'rows':6, 'cols':20}))

Views.py

class JobCreateView(generic.FormView):
    template_name = 'form_templates/createjob_form.html'
    form_class = f.JobCreateForm
    model = models.Job
    success_url = '/'

    def form_valid(self, form):
        comps = form.cleaned_data['comps']
        title = form.cleaned_data['title']
        number = form.cleaned_data['number']
        details = form.cleaned_data['details']
        job = models.Job(title=title, number=number, details=details)
        job.save()
        print(comps)
        if comps != []:
            job.comps.add(*comps)
        return super(JobCreateView, self).form_valid(form)

答案 2 :(得分:0)

您可以使用Django提供的mixins(特别是ModelFormMixin)编写自己的ModelFormView。然后您的表单将保存在成功的帖子中。

from django.views.generic.base import TemplateResponseMixin
from django.views.generic.edit import ModelFormMixin, ProcessFormView


class BaseModelFormView(ModelFormMixin, ProcessFormView):
    pass


class ModelFormView(TemplateResponseMixin, BaseModelFormView):
    pass