Django 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() и т. д.). Я следую FormView , пример SingleObjectMixin на веб-сайте Django. Я не получаю никаких ошибок, когда пытаюсь отправить форму, но объекты также не создаются. Я пытался определить метод form_valid, который запускает метод сохранения, я пытался поместить его в метод публикации в форме и т. д. Может ли кто-нибудь заметить ошибку/ошибки? Спасибо!


person user3084860    schedule 31.12.2013    source источник
comment
Ну попробуйте поставить import pdb; pdb.set_trace в свой метод сохранения вашей формы, затем вызовите этот метод из form_valid. Таким образом, вы можете увидеть, возникает ли ошибка из метода вашей формы.   -  person smarber    schedule 31.12.2013
comment
Одна большая проблема заключается в том, что метод сохранения ничего не возвращает, если ваше последнее условие не выполняется. Потому что переменная не устанавливается перед этим условием и устанавливается только в этом условии. Это единственная ошибка, которую я могу заметить. Еще одна незначительная деталь — поднятие 404 на арифметической ошибке. 404 означает, что страница отсутствует и не должна использоваться, когда что-то еще не работает. Кроме того, для ясности, поскольку вы переносите другие потенциальные ошибки в try/except, вы можете использовать get_object_or_404 во всех местах, где вы используете Model.objects.get   -  person Odif Yltsaeb    schedule 31.12.2013


Ответы (3)


Я тоже новичок в просмотре классов, и у меня была почти такая же проблема с Django 1.6.

Вы должны добавить

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

переопределение метода для вашего класса RedeemReward. Это сработало для меня.

Если вы посмотрите на исходный код Django, вы увидите, что в цепочке наследования классов FormView нет сохранения формы.

person dojy    schedule 06.08.2014

Я не уверен, поможет это или нет, но у меня были проблемы с поиском кода, показывающего, как сохранить данные из модели FormView. Это то, что я придумал. Я надеюсь, что это поможет, и вы сможете применить его к своему коду.

формы.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)
person Crystal    schedule 11.05.2016

Вы можете написать свой собственный ModelFormView, используя миксины, предоставленные Django (в частности, ModelFormMixin). Тогда ваша форма будет сохранена в успешном посте.

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
person dustinfarris    schedule 29.12.2014