Home > database >  Not allow same email to register multiple times
Not allow same email to register multiple times

Time:07-07

I would like my newsletter signup to only allow diffrent emails to signup and not allow the same email to sign up multiple times with a message email is allready in use. I cant seem to figure it out any help would be appreciated. The code is below i added the code i thought was usefull if u need more to figure it out i can post it, its a small app in a bigger project just for the email newsletter signup.

newsletter template

{% load static %}
{% block page_header %}
    <div >
        <div >
            <div ></div>
        </div>
    </div>
{% endblock %}
<div id="delivery-banner" >
    <div >
        <h4 >Sign up to Newsletter and get 5% discount</h4>
    </div>

<div  id="newsletter-wrapper">

    <form v-on:submit.prevent="onSubmit">
        <div >
        <div >
            <div  role="alert" v-if="showSuccess">
                You are Subscribed to our Newsletter!
            </div>
            <h2>Subscribe to our newsletter</h2>
            <div >
                <input type="email"  v-model="email" name="email"  placeholder="e-mail address" required>
            </div>
            <div >
                <button >Submit</button>
            </div>
        </div>
        <div >
                  <a target="_blank" rel="noopener noreferrer" href="https://facebook.com/" ><i ></i></a>
                  <a target="_blank" rel="noopener noreferrer" href="https://youtube.com/" ><i ></i></a>
                  <a target="_blank" rel="noopener noreferrer" href="https://twitter.com/" ><i ></i></a>
                  <a target="_blank" rel="noopener noreferrer" href="https://linkedin.com/" ><i ></i></a>
                </div>
    </form>

</div>
</div>

<script>
    var newsletterapp = new Vue({
        el: '#newsletter-wrapper',
        data () {
            return {
                email: '',
                showSuccess: false
            }
        },
        methods: {
            onSubmit() {
                console.log('onSubmit')

                fetch('/api/add_subscriber/', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRFToken': '{{ csrf_token }}'
                        },
                        body: JSON.stringify({'email': this.email})
                    })
                    .then((response) => {
                        return response.json()
                    })
                    .then((data) => {
                        console.log(data)

                        this.showSuccess = true
                        this.email = ''
                    })
                    .catch(function(error) {
                        this.showSuccess = false
                        console.log('Error:', error);
                    });
            }
        }
    })
</script>

admin.py

from django.contrib import admin

from .models import Subscriber

admin.site.register(Subscriber)

models.py

from django.db import models

class Subscriber(models.Model):
    email = models.EmailField(max_length=255)
    date_added = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return '%s' % self.email

views.py is empty

CodePudding user response:

For whatever field you want it to be duplicated you can use unique=True in the definition of the field. Your models has to define something like the following.

from django.db import models

class Subscriber(models.Model):
    email = models.EmailField(max_length=255, unique=True)
    date_added = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return '%s' % self.email

CodePudding user response:

def clean_email(self):
    if User.objects.filter(email=self.cleaned_data['email']).exists():
        raise forms.ValidationError("the given email is already registered")
    return self.cleaned_data['email']

add the code above in your models.py

CodePudding user response:

Another approach is to use get_or_create like if the subscriber already exists return already exists msg if not create one. Your api_add_subscriber function will be

def api_add_subscriber(request):
    data = json.loads(request.body)
    email = data['email']
    subscriber, created = Subscriber.objects.get_or_create(email=email)
    if created:
        success = True
        msg = "You subscribed!"
    else:
        success = False
        msg = "This email has already subscribed!"
    return JsonResponse({'success': success, 'msg': msg})

And you handle accordingly in the frontend;

  • Related