django - django form.errors 显示“此字段是必需的!” 使用 form.isvalid 运行 modelform 验证后
问题描述
所以我试图让一个 django 模型表单只接受通过 REGEX 的字母数字输入,如下所示:
class AddDeadCoin(forms.ModelForm):
class Meta:
model = DeadCoin
fields = (
'category',
'is_coin',
'name',
'ticker',
'founder',
'total_coins_or_tokens',
'no_exchanges',
'project_start_date',
'project_end_date',
'social_end_date',
'logo',
'screenshot',
'notes',
'links',
)
def clean_name(self):
name = self.cleaned_data.get('name')
if bool(re.match(r'^[A-Za-z0-9_-]+$', str(name))):
return name
else:
raise forms.ValidationError("Sorry , you can only have alphanumeric, _ or - in username")
def save(self):
instance = super(AddDeadCoin, self).save(commit=False)
instance.slug = orig = slugify(instance.name)
for x in itertools.count(1):
if not DeadCoin.objects.filter(slug=instance.slug).exists():
break
instance.slug = '%s-%d' % (orig, x)
instance.save()
return instance
但是,在尝试提交任何输入(有效和无效)时,我得到一个“此字段是必需的!” forms.error 消息。准确地说,我收到了两次消息。需要注意的是,'name' 和 'ticker' 字段是必需的。
这是我的模型的样子:
class DeadCoin(models.Model):
name = models.CharField(max_length=70, default=None)
summary = models.TextField(blank=True, null=True, default="Dead Coin Summary")
ticker = models.CharField(max_length=20, default=None)
founder = models.CharField(blank=True, null=True, max_length=50)
is_coin = models.BooleanField(blank=True, null=True, default=True)
notes = models.TextField(blank=True, null=True, default='')
links = models.TextField(blank=True, null=True, default='')
total_coins_or_tokens = models.CharField(blank=True, null=True, max_length=50, default='Unknown')
no_exchanges = models.BooleanField(blank=True, null=True, default=True)
project_start_date = models.CharField(blank=True, null=True, max_length=10, default='2018')
project_end_date = models.CharField(blank=True, null=True, max_length=10, default='2019')
social_end_date = models.CharField(blank=True, null=True, max_length=10, default='2019')
no_website = models.BooleanField(blank=True, null=True, default=True)
logo = models.ImageField(blank=True, null=True, upload_to = 'img/logo/', default = 'img/logo/no-logo.jpg')
screenshot = models.ImageField(blank=True, null=True, upload_to = 'img/', default = 'img/logo/no-logo.jpg')
category = models.CharField(max_length=50, default="Abandoned or No Volume")
slug = models.SlugField(unique=True)
pending = models.BooleanField(default=False)
def save(self, *args, **kwargs):
self.summary=self.summary.strip('<p>').strip('</p>')
if not self.slug:
slug_mix=self.name
self.slug = slugify(slug_mix)
super(DeadCoin, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('deadcoin', args=(self.slug,))
def __str__(self):
return self.name
这就是我的观点:
def dead_coins(request):
if request.method == 'POST':
form = AddDeadCoin(data=request.POST or None)
publish=request.POST.get('publish', '')
delete=request.POST.get('delete', '')
category=request.POST.get('category', '')
is_coin=request.POST.get('selector', '')
coinname=request.POST.get('coinname', '')
cointicker=request.POST.get('cointicker', '')
totalcoins=request.POST.get('totalcoins', None)
no_exchange=request.POST.get('ex', '')
project_start_date=request.POST.get('startd', '')
project_end_date=request.POST.get('endd', '')
social_end_date=request.POST.get('sociald', '')
no_website=request.POST.get('web', '')
founder=request.POST.get('founder', '')
screenshot=None
if not founder:
founder="Unknown"
try:
screenshot=request.FILES['screenshots']
except MultiValueDictKeyError:
pass
notes=request.POST.get('notes', '')
links=request.POST.get('links', '')
if form.is_valid():
form.save()
add_dead_coin(category, coinname, cointicker, is_coin, totalcoins, no_exchange,
project_start_date,project_end_date,social_end_date,no_website,founder,screenshot, notes, links, publish, delete, request)
return render(request, 'cryptocracy/dead_coins.html', {
'data': dead_coins_list,
})
else:
return HttpResponse(form.errors.values())
return render(request, 'cryptocracy/dead_coins.html', {
'data': dead_coins_list,
})
我试过的:
- 使用 required(true) 在表单中显式声明名称和股票代码字符字段
- 在表单中使用 exclude('name', 'ticker')
- 在ticker和name的模型中添加null=True
- 向 AddDeadCoin 表单添加一个init方法以使 name 和 ticker 字段成为必需
以及我在stackoverflow上发现的类似问题的3-4个其他建议
我怀疑我没有正确传递信息,但我不确定。任何帮助,将不胜感激。
解决方案
推荐阅读
- javascript - 为什么 JavaScript 中的 function.apply.length 为 2?
- sql - How to suppress record sets returned by SELECT statements in a Stored Procedure
- node.js - TypeError:无法在字符串上创建属性“数据”
- ansible - 不再接受来自 vars_prompt 的主机的 ansible 变量
- ubuntu - Sublime text 3 烦人的菜单白线bug
- php - 从 Laravel 中 API 的一对一关系的表中获取数据
- express - 在 Mac 上安装 Express.js
- java - 在不更改项目布局主题的情况下设置微调器适配器
- java - SwipeRefreshLayout 不适用于空列表
- postgresql - 将数据目录从根硬盘移动到另一个硬盘后如何修复postgresql的连接?