Im only a student and currently studying django. I have this in my Users/models.py
class Membership(models.Model):
membership_type = models.CharField(max_length=50)
price = models.IntegerField(default=100)
description = models.CharField(max_length=200)
def __str__(self):
return self.membership_type
class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
membership = models.ForeignKey(Membership, on_delete=models.CASCADE,null=True)
reference = models.CharField(max_length=50, null=True)
def __str__(self):
return self.user.email
here's my views.py
def BookDetail(request, id):
most_recent = Book.objects.order_by('-timestamp')[:3]
user_membership = get_object_or_404(Customer, user=request.user)
book= get_object_or_404(Book, id=id)
form = CommentForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
form.instance.user = request.user
form.instance.post = book
form.save()
return redirect(reverse("book-detail", kwargs={
'id': book.pk
}))
context = {
'user_membership': user_membership,
'form': form,
'book': book,
'most_recent': most_recent,
}
return render(request, 'catalog/book_detail.html', context)
how do I validate the user if he/she is not part of Customer model in my book_detail.html (NOTE: EDITED)
{% if request.user != user_membership.user %}
<button class="site-btn" disabled="disabled">Read</button>
{% else %}
{% for content in book.pages %}
<a href="{{ content.get_absolute_url }}" class="site-btn">Read</a>
{% endfor %}
{% endif %}
i'm having an error of "No Customer matches the given query.".. Uhm, i manually add user in Customer model in admin panel. it is not automatically added during registration(signals). but im ok with that.
You're using the context variable user_membership
for your Customer
object. That means you should use that name when looking up the Customer
object in your template. For example:
{% if request.user != user_membership.user %}
In addition, you should also ensure that you have Django's request context processor set in your settings.py
which allows you to use the request
object in your template:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'OPTIONS': {
'context_processors': (
'django.template.context_processors.request',
),
}
},
]
Update
If there is no Customer
record configured for the current logged in user, then the code will currently return a 404 to the browser. However, if you wish to continue to render the template in this case, then you should modify the view so that it sets the user_membership
variable to None:
def BookDetail(request, id):
most_recent = Book.objects.order_by('-timestamp')[:3]
try:
user_membership = Customer.objects.get(user=request.user)
except Customer.DoesNotExist:
user_membership = None
And then modify your template to check whether the user_membership
is set:
{% if user_membership and user_membership.user == request.user %}
{% for content in book.pages %}
<a href="{{ content.get_absolute_url }}" class="site-btn">Read</a>
{% endfor %}
{% else %}
<button class="site-btn" disabled="disabled">Read</button>
{% endif %}