Skip to content

Instantly share code, notes, and snippets.

@sivaa
Last active January 3, 2016 15:59
Show Gist options
  • Save sivaa/8486393 to your computer and use it in GitHub Desktop.
Save sivaa/8486393 to your computer and use it in GitHub Desktop.
Step 1: Create Movie Add form
• movies.html
<form action="/movies/" method="post"> {% csrf_token %}
Movie Name: <input type="Text" name="name"> <input type="submit" value="Add">
</form>
• views.py
return render(request, "movies.html")
• Enable it in the urls.py
Step 2: Implement Add Movie & Persist in the database
• models.py
class Movie(models.Model):
name = models.CharField(max_length=100, unique=True)
def __unicode__(self):
return self.name
• Run sync db
• views.py
def movies(request):
if request.method == 'GET':
return render(request, "movies.html")
if request.method == 'POST':
name = request.POST.get('name', None)
Movie.objects.create(name=name)
return HttpResponse("Movie '%s' added successfully!" % name)
return HttpResponse("Invalid Request")
Step 3: Implement Messaging in the same page
• movies.html
{% if message %}
{{ message }} <br> <br>
{% endif %}
• views.py (in post add the following snippets)
message = "Movie '%s' added successfully!" % name
return render(request, "movies.html", {'message': message})
Step 4: List the movies before add form.
• views.py
return render(request, "movies.html", {'message': message, 'movies': get_movies()})
def get_movies():
movies = Movie.objects.all()
return movies
• movies.html
{% if movies %}
{% for movie in movies %}
<li> {{ movie.name }} </li>
{% endfor %}
{% else %}
No movies added so far. <br>
{% endif %} <br>
Step 5: Implement remove feature in GET method
• movies.html
<li> <a href="/movies/remove/?id={{ movie.pk }}"> [x] </a> {{ movie.name }} </li>
• urls.py
url(r'^movies/remove/$', movies_remove),
• views.py
def movies_remove(request):
if request.method == 'GET':
movie_id = request.GET.get('id', None)
movie = Movie.objects.get(pk=movie_id)
movie.delete()
message = "Movie '%s' deleted successfully!" % movie.name
return render(request, "movies.html", {'message': message, 'movies': get_movies()})
return HttpResponse("Invalid Request")
Step 6: Fix Integrity Issues, exceptions & validation
• views.py
def movies(request):
if len(name.strip()) == 0:
message = "Please enter a movie name"
elif len(name.strip()) < 3:
message = "Not enough words!"
else:
try:
Movie.objects.create(name=name)
message = "Movie '%s' added successfully!" % name
except IntegrityError:
message = "Movie '%s' already exists!" % name
def movies_remove(request):
try:
movie = Movie.objects.get(pk=movie_id)
movie.delete()
message = "Movie '%s' deleted successfully!" % movie.name
except:
message = "Invalid Movie. Delete Failed!"
Step 7: Use Django Forms instead of HTML Forms
• forms.py
class MovieForm(forms.Form):
name = forms.CharField(required=False)
• views.py
def movies(request):
form = MovieForm(request.POST)
if form.is_valid():
data = form.cleaned_data
name = data['name']
return render(request, "movies.html", {'message': message, 'movies': get_movies(), 'form': MovieForm()})
def movies_remove(request):
return render(request, "movies.html", {'message': message, 'movies': get_movies(), 'form': MovieForm()})
• movies.html
<form action="/movies/" method="post"> {% csrf_token %}
{{ form.as_table }}
<input type="submit" value="Add">
</form>
Step 8: Use form validation instead of view
• forms.py
name = forms.CharField(required = True)
def clean_name(self):
name = self.cleaned_data['name']
if len(name) < 3:
raise forms.ValidationError("Not enough words!")
return name
• views.py
if form.is_valid():
data = form.cleaned_data
name = data['name']
try:
Movie.objects.create(name=name)
message = "Movie '%s' added successfully!" % name
except IntegrityError:
message = "Movie '%s' already exists!" % name
else:
message = "There are errors in the given input"
Step 9: Implement Delete Confirmation & use Post
• movies.html
<li> <a href="/movies/remove/{{ movie.pk }}"> [x] </a> {{ movie.name }} </li>
• urls.py
url(r'^movies/remove/(?P<movie_id>\d+)/$', movies_remove),
• movies_delete_confirm.html
<form method="post"> {% csrf_token %}
Would you like to delete <b> {{ movie.name }} </b> ?
<input type="submit" value="Yep. Sure">
</form>
• views.py
def movies_remove(request, movie_id):
if request.method == 'GET':
try:
movie = Movie.objects.get(pk=movie_id)
except:
message = "Invalid Movie. Delete Failed!"
return render(request, "movies.html", {'movies': get_movies(), 'message': message, 'form': MovieForm()})
return render(request, "movies_delete_confirm.html", {'movie':movie })
if request.method == 'POST':
try:
movie = Movie.objects.get(pk=movie_id)
movie.delete()
message = "Movie '%s' deleted successfully!" % movie.name
except:
message = "Invalid Movie. Delete Failed!"
return render(request, "movies.html", {'message': message, 'movies': get_movies(), 'form': MovieForm()})
return HttpResponse("Invalid Request")
Step 10: Implement Edit option
• movies.html
<li> <a href="/movies/remove/{{ movie.pk }}"> [x] </a> {{ movie.name }} <a href="/movies/edit/{{ movie.pk }}/"> [edit] </a> </li>
• urls.py
url(r'^movies/edit/(?P<movie_id>\d+)/$', movies_edit),
• movies_edit.html
<form method="post"> {% csrf_token %}
{{ form.as_table }}
<input type="submit" value="Save">
</form>
• views.py
def movies_edit(request, movie_id):
if request.method == 'GET':
try:
movie = Movie.objects.get(pk=movie_id)
form = MovieForm(initial={'name': movie.name})
except:
message = "Invalid Movie. Edit Failed!"
return render(request, "movies.html", {'movies': get_movies(), 'message': message, 'form': MovieForm()})
return render(request, "movies_edit.html", {'form':form })
if request.method == 'POST':
form = MovieForm(request.POST)
if form.is_valid():
data = form.cleaned_data
movie = Movie.objects.get(pk=movie_id)
movie.name = data['name']
movie.save()
message = "Movie %s modified successfully!" % data['name']
form = MovieForm()
else:
message = "There are errors in the given input"
return render(request, "movies.html", {'message': message, 'movies': get_movies(), 'form': form})
return HttpResponse("Invalid Request")
Step 11: Enable Admin
• forms.py
class MovieForm(forms.ModelForm):
# name = forms.CharField(required = True)
class Meta:
model = Movie
• admin.py
class MovieAdmin(admin.ModelAdmin):
form = MovieForm
admin.site.register(Movie, MovieAdmin)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment