简体   繁体   English

Django FormView不保存

[英]Django FormView Not Saving

My form isn't saving the models that I need it to. 我的表单没有保存我需要它的模型。 My form: 我的表格:

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

My Views: 我的观点:

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)

So I initially thought that the FormView would handle the form processing (validate, and, if valid, run form.save(), etc). 所以我最初认为FormView将处理表单处理(验证,如果有效,则运行form.save()等)。 I'm following the FormView, SingleObjectMixin example on the Django website. 我正在关注Django网站上的FormView,SingleObjectMixin示例。 I don't receive any errors when I try and submit the form, but no objects are created either. 我尝试提交表单时没有收到任何错误,但也没有创建任何对象。 I've tried defining a form_valid method that runs the save method, I've tried putting it inside the post method in the formview, etc. Can anyone spot the error/errors? 我已经尝试定义一个运行save方法的form_valid方法,我已经尝试将它放在formview中的post方法中,等等。有人能发现错误/错误吗? Thanks! 谢谢!

I'm new to view classes too and I had almost the same problem with Django 1.6. 我也是新手来查看类,我和Django 1.6几乎有同样的问题。

You should add 你应该添加

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

method overriding to your RedeemReward class. 方法覆盖到RedeemReward类。 This worked for me. 这对我有用。

If you look to Django source code, you will see that there is no form saving in FormView class inheritance chain. 如果您查看Django源代码,您将看到FormView类继承链中没有表单保存。

I am not sure if this will help or not, but I had issues finding code showing how to save the data from a FormView model. 我不确定这是否有帮助,但我找到了代码显示如何从FormView模型保存数据的问题。 This is what I came up with. 这就是我提出的。 I hope it helps and you can apply it to your code. 我希望它有所帮助,你可以将它应用到你的代码中。

forms.py 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 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)

You can write your own ModelFormView using the mixins provided by Django (specifically, the ModelFormMixin ). 您可以编写自己的ModelFormView使用Django的(具体而言,提供的混入ModelFormMixin )。 Then your form will be saved on a successful post. 然后您的表单将保存在成功的帖子中。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM