未调用Django模型表单清理方法

未调用Django模型表单清理方法,django,django-models,django-forms,Django,Django Models,Django Forms,我使用了Django模型表单来创建HackathonTeam实例。我在这里面临的问题是,我使用的自定义清理方法没有被调用。所有其他默认验证都正确进行 # models.py class HackathonTeam(models.Model): name = models.CharField(max_length=30) leader = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='le

我使用了Django模型表单来创建HackathonTeam实例。我在这里面临的问题是,我使用的自定义清理方法没有被调用。所有其他默认验证都正确进行

# models.py
class HackathonTeam(models.Model):
    name = models.CharField(max_length=30)
    leader = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='leader_teams')
    hackathon = models.ForeignKey(Hackathon, on_delete=models.CASCADE, related_name='hack_teams')
    vacancies = models.PositiveIntegerField(default=0)
    current_members = models.ManyToManyField(CustomUser, related_name='member_teams')
    skills_required = models.ManyToManyField(Skill, related_name='hack_requirements')
    cutoff_date = models.DateTimeField(null=True, blank=True)  # Someone may not wish to have a cut-off date
    closed = models.BooleanField(default=False)

# forms.py ########
class HackathonTeamForm(forms.ModelForm):
    class Meta:
        model = HackathonTeam
        exclude = ['leader', 'current_members', 'closed']

    def clean(self):
        print("Inside clean")
        cleaned_data = super(HackathonTeamForm, self).clean()
        print(cleaned_data)
        if HackathonTeam.objects.filter(hackathon=cleaned_data.get("hackathon"),
                                        name=cleaned_data.get("name")).exists():
            print(1)
            raise forms.ValidationError("A team with the same name already exists.")
        return cleaned_data

# views.py #########

@login_required(login_url='users:login')
def add_hackathon_team(request):
    if request.method == 'POST':
        form = HackathonTeamForm(request.POST)
        if form.is_valid():
            cd = form.clean()
            print(cd)
            print("Data is valid")
            # form.save()
            team = form.save(commit=False)
            team.leader = request.user
            team.save()
            return redirect('users:view_hackathon_team', pk=team.id)
    else:
        form = HackathonTeamForm()
    return render(request, 'users/add_hackathon_team.html', {'form': form})

正在打印视图中的打印语句,并创建新的团队。唯一的问题是不调用clean方法,也可以创建重复的团队

在HackathonTeamForm类中添加init函数:

def __init__(self, *args, **kwargs):
        super(HackathonTeamForm, self).__init__(*args, **kwargs)
您应该使用self.cleaned_data['field_name']而不是(为了确保这不会导致问题,因为您没有调用super,可能字段是空的):


您确定没有调用clean方法吗?是否打印“内部清理”或“1”(另请注意,您实际上导致该方法被调用两次;您不应该直接调用它,您应该通过
表单访问清理的数据。清理的\u数据
。否,“数据有效”是由于视图而打印的,但是“内部清理”或“1”没有打印到控制台。另外,我再次调用该方法的原因是尝试显式调用clean,看看调用了哪个方法。即使这样也不起作用。我唯一能想到的是表单的缩进与您在这里发布的不同-
clean
是否实际在
Meta
中?是的,抱歉,Daniel。这对我来说是个愚蠢的错误。这是缩进。谢谢你的帮助。我添加了init方法,但没有任何区别。我在代码中调用了super clean方法。
cleaned_data = super(HackathonTeamForm, self).clean()