如何将数据传递给Django中的clean方法

Dav*_*vid 0 django django-models django-forms

我正在将"外部"参数传递给我的自定义清理方法.

除了标识符,我使用表单传递所有内容.标识符来自URL.除了表单之外,我还需要使用标识符.

这是我的代码:

class Entry(models.Model):
    identifier = models.ForeignKey(Offer)
    name = models.CharField(max_length=64)
    description = models.TextField()


class EntryForm(ModelForm):
    class Meta:
        model = Entry

    def clean(self):
        try:
            Entry.objects.get(
                identifier=THIS IS WHAT I NEED TO FILL,
                description=self.cleaned_data['description'],
                name=self.cleaned_data['name'])
        raise forms.ValidationError(_(u'We already have an entry with the same credentials!'))
    except Entry.DoesNotExist:
        pass
    return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)

视图:

def addEntry(request, identifier):

    entry = get_object_or_404(Entry, pk=identifier)

    if request.method == "POST":
        entryForm = EntryForm(data=request.POST)
        if entryForm.is_valid():
            entry = entryForm.save(commit=False)
            entry.identifier = identifier
            entry.save()
        else:
            entryForm = EntryForm(data=request.POST)
...
Run Code Online (Sandbox Code Playgroud)

所以我错过了我可以将标识符添加到clean方法的部分.

感谢先进的帮助!

Dan*_*man 8

实例化表单时,需要从视图中传入它.通常的模式是这样的:

class EntryForm(ModelForm):
    def __init__(self, *args, **kwargs):
        self.identifier = kwargs.pop('identifier', None)
        super(EntryForm, self).__init__(*args, **kwargs)

    def clean(self):
        try:
            Entry.objects.get(
                identifier=self.identifier...
Run Code Online (Sandbox Code Playgroud)

并在视图中:

if request.method == "POST":
    entryForm = EntryForm(data=request.POST, identifier=identifier)
Run Code Online (Sandbox Code Playgroud)

  • 您需要将`self`作为参数添加到init (2认同)