首页 > 解决方案 > 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,
})

我试过的:

以及我在stackoverflow上发现的类似问题的3-4个其他建议

我怀疑我没有正确传递信息,但我不确定。任何帮助,将不胜感激。

标签: djangodjango-modelsdjango-viewsdjango-forms

解决方案


推荐阅读