在Django上使用TextField()

时间:2016-04-12 21:24:18

标签: python django

在这个项目中,我收到一个输入,其中包含单个字符串中的各种信息(即:姓名,年龄,社交号码,DoB)。

在这种情况下,我在Django上使用TextField,我希望将每个信息分开并将它们存储在数据库中。我已经尝试使用split(),但它仅适用于字符串,而且我不知道如何TextField成为字符串。

models.py

class InputData(models.Model):
    inputData = models.TextField()
    criado_em = models.DateTimeField('criado em', auto_now_add=True)

    class Meta:
        ordering = ['criado_em']
        verbose_name = (u'inputData')
        verbose_name_plural = (u'inputData\'s')

    def __unicode__(self):
        return self.inputData

form.py

class CadastroForm(forms.ModelForm):
    class Meta:
        model = InputData
        #fields = ('inputData')
        fields = '__all__'

views.py

def home(request):
    return render(request, 'index.html')

class Criar(CreateView):
    template_name = 'cadastro.html'
    model = InputData
    #fields = ('inputData')
    fields = '__all__'
    success_url = reverse_lazy('lista')

class Lista(ListView):
    template_name = 'lista.html'
    model = InputData
    context_object = 'inputData'

url.py

urlpatterns = [
    url(r'^$', home, name='home'),
    url(r'^cadastro/$', Criar.as_view(), name='cadastro'),
    url(r'^lista/$', Lista.as_view(), name = 'lista'),
    url(r'^admin/', admin.site.urls),
]

我将通过网络表单收到字符串(inputData):

"2014-02-05 09:40:00",118726,13.23,28.78,233.1908

我希望将这些信息(以逗号分隔)存储在不同的变量中。

1 个答案:

答案 0 :(得分:0)

首先,您需要更改模型,删除inputData字段并添加“拆分”字段,以便它们分别存储在数据库中:

class InputData(models.Model):
    # change, name, and insert parameters as appropriate for the data you are storing
    date_1 = models.DateTimeField(...)
    number_1 = models.IntegerField(...)
    float_1 = models.DecimalField(...)
    float_2 = models.DecimalField(...)
    float_3 = models.DecimalField(...)
    criado_em = models.DateTimeField('criado em', auto_now_add=True)

然后,您需要运行model migrations来同步数据库。确切的命令和你需要做的事情根据你使用的Django版本以及你如何设置应用程序而有所不同,但希望它不会很难。

现在,如果你不介意在你的webform中为你的每个数据提供多个字段(希望你不要这样做,因为这对于人类来说比输入以逗号分隔的字符串更容易) ,这就是你需要做的。由于您在视图配置中指定了fields = "__all__",因此所有新字段都会显示并可以输入。但是,如果您仍然需要接受相同的字符串(可能是从其他地方粘贴的话),那么您需要做更多的批次工作。

首先,您需要在应用中创建forms.py并创建新表单(请注意使用forms模块):

class InputDataCreateForm(forms.Form):
    inputData = forms.TextField(...) # insert appropriate parameters

然后,在views.py中,您需要导入新表单并修改Criar,如下所示:

class Criar(CreateView):
    template_name = 'cadastro.html'
    model = InputData
    fields = '__all__'
    success_url = reverse_lazy('lista')
    form_class = InputDataCreateForm

    # this will get called when the form is submitted and is valid
    def form_valid(self, form):
        inputData = form.cleaned_data['inputData'] # get the string
        if self.object is None:
            self.object = InputData()
        # insert all fields you are going to be extracting from the
        # input string here in the proper order:
        self.object.date_1, self.object.date_2, ... = inputData.split(',')
        self.object.save()
        return self.get_success_url()

但是,我想指出这是非常容易破坏。例如,如果我输入的字符串分成6个项而不是5个(或者应用程序预期的数量多少)会发生什么?如果我输入一个看起来像"not-a-date 30:61:61,numbers,5/2,hello,testing的字符串(我故意忘记了日期中的第二个引号)怎么办?当你可以让人们单独输入每个字段时,你必须对每个事情进行手动验证,而你只需要改变你的模型。除非你真的,真的需要能够让用户以这种格式输入一个字符串,我不会那样做。