nik
nik

Reputation: 8745

django - prevent duplicates for users

Here is the Model class

class Album(models.Model):
    name = models.CharField(max_length=256)
    public = models.BooleanField(default=False)
    user = models.ForeignKey(get_user_model())

    class Meta:
        unique_together = (("name", "user"),)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('photos:index')

Here is the View

class Create(CreateView):
    model = Album
    fields = ['name', 'public']
    form_class = AlbumCreateForm

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(Create, self).form_valid(form)

And here is the form Class

class AlbumCreateForm(ModelForm):
    class Meta:
        model = Album
        fields = ['name', 'public']
        labels = {'name': '', 'public': 'Public'}

    def __init__(self,*args, **kwargs):
        super(AlbumCreateForm, self).__init__(*args, **kwargs)
        self.fields['name'].widget = forms.TextInput(
            attrs={'placeholder': 'name'})

I can create album just fine, but what I would like to do is prevent duplicate albums from being created for a particular user. For example if user1 has already created album1, he should not be able to create another album named album1.

The place where I can do it is AlbumCreateForm. But AlbumCreateForm does not have any knowledge of current user. Any idea how it can be accomplished?

Upvotes: 3

Views: 974

Answers (1)

zymud
zymud

Reputation: 2249

  1. Pass user to form - add him to form kwargs by adding this method to view:

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super(Create, self).get_form_kwargs(*args, **kwargs)
        kwargs['user'] = self.request.user
        return kwargs
    
  2. Get user in form and check:

    def __init__(self,*args, **kwargs):
        self.user = kwargs.pop('user') # this line added
        super(AlbumCreateForm, self).__init__(*args, **kwargs)
        self.fields['name'].widget = forms.TextInput(
           attrs={'placeholder': 'name'})
    
    def clean(self):
        if Album.objects.filter(user=self.user).exists():
            raise forms.ValidationError('Error description')
    

Upvotes: 3

Related Questions