【问题标题】:How to raise forms validation error when ever the user try's to create an object with the object twice当用户尝试使用对象创建对象两次时如何引发表单验证错误
【发布时间】:2017-10-13 22:17:37
【问题描述】:

我使用了唯一的共同模型元,它可以工作,但它只是出现了这个错误。我想引发表单验证错误,而不是 IntegrityError。

/name/ 处的完整性错误

UNIQUE 约束失败:canvas_canvas.user_id、canvas_canvas.canvas_name

请求方法:POST 请求网址:http://127.0.0.1:8000/name/ 异常类型:IntegrityError 异常值:

UNIQUE 约束失败:canvas_canvas.user_id、canvas_canvas.canvas_name

异常位置:C:\Users\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\backends\sqlite3\base.py 在执行,第 337 行

class Canvas(models.Model):
    user                = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    canvas_name         = models.CharField(
                        max_length=100,
                        validators=[
                            # validate_canvas_title,
                            RegexValidator(
                                    regex=CANVAS_REGEX,
                                    message='Canvas must only contain Alpahnumeric characters',
                                    code='invalid_canvas_title'
                                )],
                        )
    slug                = models.SlugField(max_length=100, blank=True)
    background_image    = models.ImageField(
                        upload_to=upload_location,
                        null=True,
                        blank=True,
                        )
# sort catergory into alphabetical order
    category            = models.ForeignKey('category.Category', default=1, blank=True)
    followers           = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='canvas_followed_by', blank=True)

class Meta:
    unique_together = ['user', 'canvas_name']

表格

class CanvasModelForm(ModelForm):
    class Meta:
        model = Canvas
        fields = ['canvas_name', 'category', 'background_image']
        widgets = {
            'canvas_name': TextInput(attrs={'class': 'form-input'}),
            'category': Select(attrs={'class': 'form-input'}),
        }

查看

    user = get_object_or_404(User, username=username)

    form_create = CanvasModelCreateForm(request.POST or None)
    if form_create.is_valid():
        instance = form_create.save(commit=False)
        instance.user = request.user
        instance.save()
        return redirect('canvases:canvas', username=request.user.username, slug=instance.slug)

    template = 'pages/profile.html'
    context = {
        'user': user,
        'form_create': form_create,
    }
    return render(request, template, context)

【问题讨论】:

  • 没有。您的表单进行验证。但是你没有显示任何代码,所以我们看不出有什么问题。
  • 我刚刚更新了这个问题。我认为类元(unique_together = ['user','canvas_name'])。是错误的原因。
  • 什么是实际错误和回溯?风景在哪里?

标签: django django-models django-forms


【解决方案1】:

您可以通过将request.user 传递到表单中并使用它来验证canvas_name 来做到这一点。

您需要覆盖表单的__init__ 方法以获取额外的关键字参数user。这会将用户存储在表单中、需要的位置以及您可以在 clean 方法中访问的位置。

def __init__(self, *args, **kwargs):
    self.user = kwargs.pop('user', None)
    super(CanvasModelCreateForm, self).__init__(*args, **kwargs)

def clean_canvas_name(self):
    canvas_name = self.cleaned_data.get('canvas_name')
    if Canvas.objects.get(user=self.user, canvas_name=canvas_name).exists():
        raise forms.ValidationError(u'Canvas with same name already exists.')
    return canvas_name

你应该像这样改变你的看法,

form_create = CanvasModelCreateForm(request.POST, user=request.user)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多