我最终试图通过扩展类型验证FileField.但是我甚至无法为此字段获取清除方法以获取POSTed值.
from django.forms.forms import Form
from django.forms.fields import FileField
from django.forms.util import ValidationError
class TestForm(Form):
file = FileField(required=False)
def clean_file(self):
value = self.cleaned_data["file"]
print "clean_file value: %s" % value
return None
@localhost
def test_forms(request):
form = TestForm()
if request.method == "POST":
form = TestForm(request.POST)
if form.is_valid():
print "form is valid"
return render_to_response("test/form.html", RequestContext(request, locals()))
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我得到以下输出:
clean_file value: None
form is valid
Run Code Online (Sandbox Code Playgroud)
换句话说,clean_file方法无法获取文件数据.同样,如果它返回None,则表单仍然有效.
这是我的表单html:
<form enctype="multipart/form-data" method="post" action="#">
<input type="file" id="id_file" name="file">
<input type="submit" value="Save">
</form>
Run Code Online (Sandbox Code Playgroud)
我已经看到了几个片段与解决方案对于这个问题,但我不能让他们与非模型的形式工作.它们都声明了自定义字段类型.当我这样做时,我遇到同样的问题; …
我正在进行一些文件验证,并希望将UploadedFile加载到外部库中,而它位于'/ tmp'目录中,然后将其保存到可以执行的地方.Django执行以下操作:
Django会将上传的文件写入存储在系统临时目录中的临时文件中.在类似Unix的平台上,这意味着你可以期待Django生成一个名为/ tmp/tmpzfp6I6.upload的文件.
它IHE"tmpzfp616.upload",我希望能够得到我的手.UploadedFile.name给我'’,而file.name给我的文件'example.mp3’的正确名称.
使用我正在使用的库,我需要将临时文件的文件路径传递给库,而不是文件本身,因此需要字符串.
有任何想法吗?
提前致谢.
编辑:这是我的代码:
from django.core.files.uploadedfile import UploadedFile
class SongForm(forms.ModelForm):
def clean_audio_file(self):
file = self.cleaned_data.get('audio_file',False)
if file:
[...]
if file._size > 2.5*1024*1024:
try:
#The following two lines are where I'm having trouble, MP3 takes the path to file as input.
path = UploadedFile.temporary_file_path
audio = MP3('%s' %path)
except HeaderNotFoundError:
raise forms.ValidationError("Cannot read file")
else:
raise forms.ValidationError("Couldn't read uploaded file")
return file
Run Code Online (Sandbox Code Playgroud)
使用"UploadedFile"我得到一个AttributeError"类型对象''UploadedFile'没有属性'temporary_file_path'".如果我改为使用file.temporary_file_path(这里只是在黑暗中投掷飞镖),我得到一个IOError:
[Errno 2]没有这样的文件或目录:'bound method TemporaryUploadedFile.temporary_file_path of>'
我发现temporary_file_path是我正在寻找的解决方案,我只是无法弄清楚如何使用它,在这个特定的实例中,docs和google似乎都没有多大帮助.
我正在尝试在Django中执行此操作:在Admin中保存对象时,我想根据我的第一个对象中的一个字段保存另一个不同类型的对象.为了做到这一点,我必须检查第二个对象是否已经存在,并且只返回第一个对象中特定字段的验证错误.我的问题是,只有当操作是插入时,我才希望验证错误出现在字段中.
如何根据知道操作是更新还是插入来显示特定管理表单字段的验证错误?
PS我知道对于模型验证这是不可能的,因为验证器只接受value参数,但我认为应该可以进行表单验证.
我希望使用CSS为我的表单提供更好的反馈.我已经在做了,但这只是一个干净的代码问题.我有很多ModelForms,我希望他们所有人都以同样的方式行事,所以我认为应该有办法避免重复验证代码.
我创建了一个覆盖的新类 ModelForm
class ModelFormCSS(forms.ModelForm):
def is_valid(self):
# run the parent validation first
valid = super(-->ParentModelForm<--, self).is_valid()
if not valid:
for f_name in self.errors:
classes = self.fields[f_name].widget.attrs.get('class', '')
if not "errors" in classes:
classes += ' errors'
self.fields[f_name].widget.attrs['class'] = classes
return valid
# all good
return True
Run Code Online (Sandbox Code Playgroud)
我的问题在于运行父验证,因为我不知道如何获取父表单...是不是有任何方法可以从中获取它self?
我想写一个注册用户的表单.我想实现一个密码匹配,用户必须输入两次密码.这是我目前的表格:
from django import forms
from passwords.fields import PasswordField
class AccountForm(forms.Form):
email = forms.EmailField(max_length=255)
username = forms.CharField(max_length=40)
password = PasswordField(label="Password")
password_confirm = PasswordField(label="Password")
Run Code Online (Sandbox Code Playgroud)
在我看来,我想检查验证,如果某些内容无效,我想在模板中打印特定的错误.这是我的观点的当前状态:
def signup(request):
if request.method == 'POST':
form = AccountForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
username = form.cleaned_data['username']
password = form.cleaned_data['password']
password_confirm = form.cleaned_data['password_confirm']
if password != password_confirm:
print("Password don't match")
#Account.objects.create_user(email, password, username = username)
else:
print(form.errors)
form = Account()
return render(request, 'authentication/auth.html', {'signup': form})
Run Code Online (Sandbox Code Playgroud)
现在我的目标是将表单错误传递给模板.我检查例如password与password_confirm变量的匹配.如果它们不匹配,我希望它在模板中可见.你们知道如何将我的自定义表单错误/验证添加到我的表单中并在我的模板中显示这些错误吗?
在formin中django,validator一个字段的a 和该字段的clean_<field>方法有什么区别?
我目前正在创建一个基于DRF的api.我有一个模型,如:
class Task(models.Model):
name = models.CharField(max_length = 255)
completed = models.BooleanField(default = False)
description = models.TextField()
text = models.TextField(blank = False, default = "this is my text" )
def __unicode__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
此模型的相应Serializer如下:
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ('name','description','completed','text')
Run Code Online (Sandbox Code Playgroud)
现在我的问题是我想在获取数据时验证模型的"名称"字段.例如,我可能会通过类似于Django Form的Python代码来检查用户的名字或第二个名字:
def clean_name(self):
name = form.cleaned_data.get('name')
first,second = name.split(' ')
if second is None:
raise forms.ValidationError("Please enter full name")
Run Code Online (Sandbox Code Playgroud)
我在Serializers.serializer类中知道名为'validate_(fieldname)'的东西.但我希望在Serializers.ModelSerializer中使用它.(类似于Django中的自定义表单验证)
django django-validation django-serializer django-rest-framework
我正在努力ModelSerializer解决以下问题。
1)无法验证.validate(self, data)方法,因为我想返回不起作用的自定义验证器消息。
模型.py
class BlogModel(models.Model):
BLOG_STATUS = (
('PUBLISH', 'Publish'),
('DRAFT', 'Draft'),
)
blog_id = models.AutoField(primary_key=True)
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='blogs')
title = models.CharField(max_length=255)
content = models.TextField(blank=True, null=True)
status = models.CharField(max_length=7, choices=BLOG_STATUS)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta():
db_table = 'blogs'
verbose_name = 'Blog'
verbose_name_plural = 'Blogs'
def __str__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
序列化器.py
import datetime
from django.contrib.auth.models import User
from django.utils.timezone import now
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer,Serializer
from blogs.models …Run Code Online (Sandbox Code Playgroud) python django django-validation django-serializer django-rest-framework
我有一个应用程序有一个名为Verifications. 它具有诸如:asset_code、Status、Location、Emp_id 等字段。我可以使用 django 管理面板中的“添加验证”添加验证。但我想限制添加重复的 asset_code 条目(如果 asset_code 已经存在)。
class Verification(models.Model):
asset_code = models.CharField(verbose_name="Asset Code",max_length=16, default="")
scan_time = models.DateTimeField(verbose_name="Time of smartDNA scan",auto_now_add=True,default=datetime.datetime.now)
credential = models.CharField(verbose_name="smartDNA Credential",max_length=16, default="")
status = models.IntegerField(verbose_name="Scanning Status",choices=STATUS_CHOICES,default=1)
operator = models.CharField(verbose_name="Operator",max_length=16, default="")
location = models.CharField(verbose_name="Branch",max_length=64, default="")
auth_code = models.CharField(verbose_name="Scanner Authentication",max_length=20, default="DSC(Verisign")
emp_id = models.CharField(verbose_name="EMP ID",max_length=16, default="")
image = models.CharField(verbose_name="Image",max_length=24, default="dd")
created = models.DateTimeField(verbose_name="Created on",blank=True,auto_now_add=True)
modified = models.DateTimeField(verbose_name="Modified on",blank=True,auto_now=True)
product_details = models.CharField(verbose_name="Product Details",max_length=64, default="")
Run Code Online (Sandbox Code Playgroud)
状态字段的值可以介于 1 到 10 之间。
如果 asset_code 已经存在并且状态=1,我如何防止在模型中添加条目。
我有这样的形式:
class TitlePropose(forms.Form):
title = forms.CharField(max_length=128)
code= forms.CharField(max_length=32)
def __init__(self, contest, *args, **kwargs):
super(TitlePropose, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = self.__class__.__name__.lower()
self.helper.form_action = ''
self.helper.layout = Layout(,
Field('title'),
Field('code'),
)
def clean_title(self):
if OtherModel.objects.filter(contest=contest, title=self.cleaned_data['title']).count() > 0:
raise forms.ValidationError("Title unavailable")
else:
return self.cleaned_data['title']
Run Code Online (Sandbox Code Playgroud)
我尝试从 clean_title 方法访问变量“contest”,但没有成功。我在表单类构造函数中传递这个变量:
#contest is just some object
new_title_form = TitlePropose(contest=contest.uuid)
Run Code Online (Sandbox Code Playgroud)
有什么建议吗,我如何才能访问 clean_title 中的“竞赛”?