在这个项目中,我收到一个输入,其中包含单个字符串中的各种信息(即:姓名,年龄,社交号码,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
我希望将这些信息(以逗号分隔)存储在不同的变量中。
答案 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
的字符串(我故意忘记了日期中的第二个引号)怎么办?当你可以让人们单独输入每个字段时,你必须对每个事情进行手动验证,而你只需要改变你的模型。除非你真的,真的需要能够让用户以这种格式输入一个字符串,我不会那样做。