本文介绍了Django表单数据不提交/可见在mysql数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用连接到MySQL数据库的SessionWizardView设计并构建了一个Django 1.6.2调查应用程序。



问题是(尽可能请参阅)提交的表单数据未被保存到数据库。这是我第一次构建这样的应用程序,甚至使用数据库。



有人可以看看我做了什么,我的代码和点我所做的错误是为什么我看不到任何由我的调查表格提交的内容?



方法。您可以在向导的方法。

  def done(self,form_list,** kwargs):
#我不知道这是否工作,我不熟悉你的表单。
form_list中的表单:
form.save()
#注意文档建议重定向而不是渲染模板。
return render(self.request,'return_to_AMT.html',{
'form_data':form_list中的form的表单,
})


I designed and built a Django 1.6.2 survey application using a SessionWizardView which is connected to a MySQL database.

The problem is that (as far as I can see) the submitted form data is not getting saved to the database. This is my first time building an application like this or even working with a database.

Could someone take a look at what I have done and my code and point out any mistakes I have made as to why I cannot see any content submitted by my survey form?

The last time I posted a similar question I was told I needed to create a Model for the data and it was suggested I use a ModelForm to create the table and columns in the database. I have done this but I am still not seeing my submitted content

My Process

  • I created the database in MySQL (Ver 14.14 Distrib 5.6.20) viaTerminal CREATE database django_db; and the tables in it are createdwhen I run the command python manage.py syncdb.

  • I can complete my survey both on my local machine and on the public server. No errors and it appears everything works fine

  • I have setup phpMyAdmin and can see the django_db database and survey_person model. However I can not seem to find any of the data that should be submitted by the form.

  • I have tried to use the search facility in phpMyAdmin to find any of the form data I submitted but cannot see it

  • I have exported the database as a .CSV file but it is empty.

  • If I use the insert facility in phpMyAdmin the data gets saved in the DB and I can return it when I use the search facilities. The same data is also in the CSV file when I export it.

This seem to suggest that I am missing a step somewhere in my application when it comes to submitting content to the DB.

Can anyone tell me where I am going wrong?

My Code

I have tried to limit the below to only relevant code

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_db',
        'USER': 'root',
        'PASSWORD': 'xxxxxxxxxxxxxxxxx',
        'HOST': '127.0.0.1',
        #'PORT': '',
    }
}

urls.py

url(r'^surveyone/$', SurveyWizardOne.as_view([
                                             SurveyFormA,
                                             SurveyFormB,
                                             SurveyFormC,
                                             ....
                                             ....
                                             SurveyFormG,
                                             SurveyFormH,
                                             SurveyFormI
                                             ])),

forms.py

class SurveyFormA(forms.ModelForm):

    birthdate = forms.DateField(widget=extras.SelectDateWidget(years = range(1995, 1900, -1)), required=False)

    class Meta:
        model = Person
        fields = ['sender', 'birthdate', 'sex', 'relationship', 'state']



class SurveyFormB(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['internet_usage', 'smart_phone_ownership', 'smart_phone_usage']

        widgets = {'internet_usage' : RadioSelectNotNull,
                   'smart_phone_ownership' : RadioSelectNotNull,
                   'smart_phone_usage' : RadioSelectNotNull,
                   }


class SurveyFormC(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['education', 'wages', 'presentage_savings', 'occupation', 'living']

        widgets = {'education' : forms.RadioSelect,
                   'wages' : forms.RadioSelect,
                   'presentage_savings' : forms.RadioSelect,
                   'occupation' : forms.RadioSelect,
                   'living' : forms.RadioSelect,}

        ....
        ....

models.py

     sender = models.EmailField(null=True, blank=True, verbose_name='What is your email address?')

        birthdate = models.DateField(null=True, blank=True) #overwritten in forms.py so passed no more arguments

        SEX = (
            ('MALE', 'Male'),
            ('FEMALE', 'Female'))
        sex = models.CharField(null=True, blank=True, max_length=100, choices=SEX, verbose_name='What sex are you?')


        RELATIONSHIP = (
            ('SINGLE', "Single"),
            ('INARELATIONSHIP', "In a relationship"),
            ('MARRIED', "Married"),
            ('DIVORCED', "Divorced"),
            ('SEPARATED', "Separated"),
            ('WIDOWED', "Widowed"),)
        relationship = models.CharField(null=True, blank=True, max_length=100, choices=RELATIONSHIP, verbose_name='What is your relationship status?')



                ....

                ....

                def __unicode__(self):
                return self

views.py

My views.py are the most complex part of my application. Not sure if it necessary to show any but I thought just in case

class SurveyWizardOne(SessionWizardView):
    def get_context_data(self, form, **kwargs):
        context = super(SurveyWizardOne, self).get_context_data(form, **kwargs)
        step = int(self.steps.current)

        if step == 0:
            self.request.session['path_one_images'] = ['P1D1.jpg', 'P2D2.jpg', 'P3D3.jpg', 'P4D4.jpg', 'P5D5.jpg', 'P6D6.jpg', 'P7D7.jpg', 'P8D8.jpg', 'P9D9.jpg']
            self.request.session['instruction_task_one_images'] = ['IT1A.jpg', 'IT1B.jpg', 'IT1C.jpg']
            self.request.session['instruction_task_two_images'] = ['IT2A.jpg', 'IT2B.jpg', 'IT2C.jpg']
            self.request.session['images'] = []
            self.request.session['slider_DV_values'] = []


        PATH_ONE_IMAGES = self.request.session.get('path_one_images', [])
        images = self.request.session.get('images', [])
        slider_DV_values = self.request.session.get('slider_DV_values', [])
        INSTRUCTION_TASK_ONE_IMAGES = self.request.session.get('instruction_task_one_images', [])
        INSTRUCTION_TASK_TWO_IMAGES = self.request.session.get('instruction_task_two_images', [])

        if step in range (0, 27):
            self.request.session['path_one_images'] = PATH_ONE_IMAGES
            self.request.session['images'] = images
            self.request.session['slider_DV_values'] = slider_DV_values
            self.request.session['instruction_task_one_images'] = INSTRUCTION_TASK_ONE_IMAGES
            self.request.session['instruction_task_two_images'] = INSTRUCTION_TASK_TWO_IMAGES

            if step == 0:
                instruction_task_first_image = random.choice(INSTRUCTION_TASK_ONE_IMAGES)
                context['display_image'] = instruction_task_first_image

            elif step == 1:
                instruction_task_second_image = random.choice(INSTRUCTION_TASK_TWO_IMAGES)
                context['display_image'] = instruction_task_second_image

            elif step == 9:
                first_image = random.choice(PATH_ONE_IMAGES)
                PATH_ONE_IMAGES.remove(first_image)
                context['display_image'] = first_image
                images.insert(0, first_image)
                self.request.session['first_image'] = images[0]
                self.request.session.get('first_image')

            elif step == 10:
                second_image = random.choice(PATH_ONE_IMAGES)
                PATH_ONE_IMAGES.remove(second_image)


            ....

            ....


        return context


    def done(self, form_list, **kwargs):
        return render(self.request, 'Return_to_AMT.html', {
            'form_data': [form.cleaned_data for form in form_list],
        })

phpMyAdmin

A screenshot of the DB from phpMyAdmin. NOTE: Not the hidden fields at the start are for introduction steps in the survey form, code not shown here for brevity.

解决方案

Submitting data to a model form does not cause it to be saved automatically. If you want save data from a model form to the database, you need to call its save() method. You could do this in the wizard's done() method.

def done(self, form_list, **kwargs):
    # I don't know whether this will work, I am not familiar with your forms.
    for form in form_list:
        form.save()
    # Note the docs suggest redirecting instead of rendering a template.
    return render(self.request, 'Return_to_AMT.html', {
        'form_data': [form.cleaned_data for form in form_list],
    })

这篇关于Django表单数据不提交/可见在mysql数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-15 17:14