from django.contrib.auth.models import User
import datetime
from django.core.urlresolvers import reverse
-from django.template.defaultfilters import slugify
+from slugify import SlugifyUniquely
class Ingredient(models.Model):
name = models.CharField(max_length=100)
- slug = models.SlugField()
+ slug = models.SlugField(unique=True)
def __unicode__(self):
return self.name
class Sandwich(models.Model):
adjective = models.CharField(max_length=200)
- slug = models.SlugField()
+ slug = models.SlugField(unique=True)
date_made = models.DateField()
ingredients = models.ManyToManyField(Ingredient)
date_added = models.DateTimeField(default=datetime.datetime.now, editable=False)
- picture = models.ImageField(upload_to='sandwiches/')
- notes = models.TextField()
+ picture = models.ImageField(upload_to='sandwiches/', blank=True)
+ notes = models.TextField(blank=True)
user = models.ForeignKey(User)
class Meta:
return reverse('sandwich_by_slug', kwargs={'slug':self.slug})
def save(self, *args, **kwargs):
- self.slug = slugify(self.adjective)
+ self.slug = SlugifyUniquely(self.adjective, Sandwich)
super(Sandwich, self).save(*args, **kwargs)
--- /dev/null
+from django.template.defaultfilters import slugify
+def SlugifyUniquely(value, model, slugfield="slug"):
+ """Returns a slug on a name which is unique within a model's table
+
+ This code suffers a race condition between when a unique
+ slug is determined and when the object with that slug is saved.
+ It's also not exactly database friendly if there is a high
+ likelyhood of common slugs being attempted.
+
+ A good usage pattern for this code would be to add a custom save()
+ method to a model with a slug field along the lines of:
+
+ from django.template.defaultfilters import slugify
+
+ def save(self):
+ if not self.id:
+ # replace self.name with your prepopulate_from field
+ self.slug = SlugifyUniquely(self.name, self.__class__)
+ super(self.__class__, self).save()
+
+ Original pattern discussed at
+ http://www.b-list.org/weblog/2006/11/02/django-tips-auto-populated-fields
+ """
+ suffix = 0
+ potential = base = slugify(value)
+ while True:
+ if suffix:
+ potential = "-".join([base, str(suffix)])
+ if not model.objects.filter(**{slugfield: potential}).count():
+ return potential
+ # we hit a conflicting slug, so bump the suffix & try again
+ suffix += 1
import datetime
def sidebar_context(request):
- if Sandwich.objects.count() > 5:
- sandwiches = Sandwich.objects.order_by('-date_made')[:5]
+ x = Sandwich.objects.order_by('-date_made')
+ if x.count() > 5:
+ sandwiches = x[:5]
else:
- sandwiches = Sandwich.objects.order_by('-date_made')
- return {'sandwiches': sandwiches}
+ sandwiches = x
+ monthly = Sandwich.objects.dates('date_made', 'month')
+ return {'sandwiches': sandwiches, 'monthly': monthly, 'user': request.user}
def add_sandwich(request):
- if Sandwich.objects.count() > 5:
- sandwiches = Sandwich.objects.order_by('-date_made')[:5]
- else:
- sandwiches = Sandwich.objects.order_by('-date_made')
if request.user.is_authenticated():
if request.method == 'POST': # If the form has been submitted...
form = SandwichForm(request.POST, request.FILES) # A form bound to the POST data
return HttpResponse(thankshtml) # Redirect after POST
else:
form = SandwichForm(initial={'user': request.user}) # An unbound form
- return render_to_response('sandwich.html', {'sform': form, 'user': request.user,}, context_instance=RequestContext(request))
+ return render_to_response('sandwich.html', {'sform': form,}, context_instance=RequestContext(request))
else:
thankshtml = "<p class=\"formthanks\">You are not logged in.</p>"
return HttpResponse(thankshtml) # Redirect after POST
def add_ingredient(request):
if request.user.is_authenticated():
- if Sandwich.objects.count() > 5:
- sandwiches = Sandwich.objects.order_by('-date_made')[:5]
- else:
- sandwiches = Sandwich.objects.order_by('-date_made')
if request.method == 'POST': # If the form has been submitted...
form = IngredientForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
else:
form = IngredientForm() # An unbound form
- return render_to_response('ingredient.html', {'iform': form, 'user': request.user,}, context_instance=RequestContext(request))
+ return render_to_response('ingredient.html', {'iform': form,}, context_instance=RequestContext(request))
else:
thankshtml = "<p class=\"formthanks\">You are not logged in.</p>"
return HttpResponse(thankshtml) # Redirect after POST
def all_sandwich(request):
try:
allsandwiches = Sandwich.objects.all()
- if Sandwich.objects.count() > 5:
- sandwiches = Sandwich.objects.order_by('-date_made')[:5]
- else:
- sandwiches = Sandwich.objects.order_by('-date_made')
- except Sandwich.DoesNotExist:
- raise Http404
- return render_to_response('allsandwiches.html', {'allsandwiches': allsandwiches, 'user': request.user,}, context_instance=RequestContext(request))
-
-
-def baseview(request):
- try:
- if Sandwich.objects.count() > 5:
- sandwiches = Sandwich.objects.order_by('-date_made')[:5]
- allsandwiches = Sandwich.objects.all()
- else:
- sandwiches = Sandwich.objects.order_by('-date_made')
- allsandwiches = Sandwich.objects.all()
except Sandwich.DoesNotExist:
raise Http404
- return render_to_response('base.html', {'all': allsandwiches,}, context_instance=RequestContext(request))
+ return render_to_response('allsandwiches.html', {'allsandwiches': allsandwiches,}, context_instance=RequestContext(request))
def sandwich_month(request, year, month):
try:
ms = Sandwich.objects.filter(date_made__month=month, date_made__year=year)
- if Sandwich.objects.count() > 5:
- sandwiches = Sandwich.objects.order_by('-date_made')[:5]
- else:
- sandwiches = Sandwich.objects.order_by('-date_made')
except Sandwich.DoesNotExist:
raise Http404
- return render_to_response('allsandwiches.html', {'allsandwiches': ms, 'user': request.user,}, context_instance=RequestContext(request))
+ return render_to_response('allsandwiches.html', {'allsandwiches': ms,}, context_instance=RequestContext(request))
def current_home(request):
temp = Sandwich.objects.order_by('-date_made')[0]
curr_year = temp.date_made.year
try:
ms = Sandwich.objects.filter(date_made__month=curr_month, date_made__year=curr_year)
- if Sandwich.objects.count() > 5:
- sandwiches = Sandwich.objects.order_by('-date_made')[:5]
- else:
- sandwiches = Sandwich.objects.order_by('-date_made')
except Sandwich.DoesNotExist:
raise Http404
- return render_to_response('allsandwiches.html', {'allsandwiches': ms, 'user': request.user,}, context_instance=RequestContext(request))
+ return render_to_response('allsandwiches.html', {'allsandwiches': ms,}, context_instance=RequestContext(request))
def specific_sandwich(request, slug):
sandwiches = Sandwich.objects.order_by('-date_made')
except Sandwich.DoesNotExist:
raise Http404
- return render_to_response('onesandwich.html', {'s': s, 'user': request.user,}, context_instance=RequestContext(request))
+ return render_to_response('onesandwich.html', {'s': s,}, context_instance=RequestContext(request))
def logout_view(request):
if request.user.is_authenticated():
return HttpResponse(thankshtml)
except KeyError:
aform = AuthenticationForm()
- return render_to_response('login.html', {'aform': aform, 'user': request.user,}, context_instance=RequestContext(request))
+ return render_to_response('login.html', {'aform': aform,}, context_instance=RequestContext(request))
def create_user(request):
return HttpResponse(thankshtml) # Redirect after POST
else:
form = NewUserForm() # An unbound form
- return render_to_response('newuser.html', {'cform': form, 'user': request.user,}, context_instance=RequestContext(request))
\ No newline at end of file
+ return render_to_response('newuser.html', {'cform': form,}, context_instance=RequestContext(request))
\ No newline at end of file