Django Model Form没有被调用的方法

时间:2018-02-19 19:27:52

标签: 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='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})

正在打印视图中的print语句,同时也会创建新的Teams。唯一的问题是没有调用clean方法,也可以创建重复的团队。

1 个答案:

答案 0 :(得分:-1)

在HackathonTeamForm类中添加init函数:

def __init__(self, *args, **kwargs):
        super(HackathonTeamForm, self).__init__(*args, **kwargs)

你应该使用self.cleaned_data ['field_name']代替(以确保它不会导致问题,因为你不会调用超级可能字段是空白的):

cleaned_data = super(HackathonTeamForm, self).clean()