Udendu Abasili
Udendu Abasili

Reputation: 1213

I want to use the if statement based on the existence of a web page

So basically i have a complicated scenario. I am current using Django to build a website and i have current made two apps. Both apps have almost identical fields. The field I would want to focus on though is the Information field(which they both have and which i have auto generated with the help of the Wikipedia model) So the case here is that I want to create an if and else statement in the html in such a way that if the page i am hyperlinking to exists it would go to the link dealing with DetailView but if it doesnt exist I would redirected to the Create View I should also note that the two apps have their names linked with the help of the foreign key but when i try to open information links using the same name , they gave me different pks

I dont feel like i explained my problem well enough but I hope someone can understand what i mean

UPDATE

ok I create the get function using

    def get(self, request, *args, **kwargs):
    try:
        self.object = self.get_object()
    except Http404:

        return redirect('/create/')
    context = self.get_context_data(object=self.object)
    return self.render_to_response(context)

but i dont know how to use the CreateView fuction i created instead of the link i put

This is the Detail View Html

{%extends "home.html"%}
{%block head_title%} {{block.super}}{%endblock head_title%}
{% block content%}
<!-- verify authentication -->
{% if request.user.is_authenticated%}

<h3><a href="{%url 'InfoPedia:UpdateView' object.id %}">{{object.title}}</a></h3><br/>


{% endif %}
<ul type="disc">
<div class="container">

<li><b>Artist: </b>{{object.Summary}}</li>
<li><b>Genre: </b>{{object.Genre}}</li>
<li><b>Bio: </b><br>{{object.Bio}}</li>
<a href ="/Blog/{{object.slug}}/edit">EDIT</a>
</div>
</ul>
{%endif%}
{% endblock %}

This is my model

from django.db import models
from django.conf import settings
from Blog.models import MainPage
from django.urls.base import reverse
from Blog.Retrieve import retriever
from django.db.models.signals import pre_save,post_save
import InfoPedia


class InfoPedia(models.Model):

    user    =models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    Name        =models.ForeignKey(MainPage,on_delete=models.CASCADE)
    Location      =models.CharField(max_length= 50,null=True,blank=True)
    Information        =models.TextField(null=True,blank=True)
    TrackListing=models.TextField(null=True,blank=True)
    Published=models.BooleanField(default=True)
    Timestamp=models.DateTimeField(auto_now=True)
    Updated=models.DateTimeField(auto_now=True)


    def get_absolute_url(self):
#         return f"/Blog/{self.slug}"
        return reverse('InfoPedia:DetailView', kwargs={"pk":self.pk})

    class Meta:
        ordering=["-Updated","-Timestamp"] #orranges in order of updated

    def get_tracklist(self):
        return self.TrackListing.split(",")

def Information_create_pre_save( instance, sender, **kwargs):
        instance.Information=retriever(instance.Name)


def rl_post_save_reciever(sender, instance,created,*args,**kwargs):
        print("saved")
        print(instance.Timestamp)  


pre_save.connect(Information_create_pre_save, sender=InfoPedia)  

post_save.connect(rl_post_save_reciever, sender=InfoPedia) 

Upvotes: 0

Views: 65

Answers (1)

Chris Applegate
Chris Applegate

Reputation: 762

An alternative - rather than checking the if/else in the HTML, just make all the links to the DetailView URL.

Then, in the get() handler for the DetailView, you perform a queryset lookup for the object. If no object is found, then instead of displaying the DetailView HTML, return to the user a 302 redirect (i.e. a temporary redirect) to the CreateView for that object. So all your if/else logic is in the view function or class, instead of HTML.

Upvotes: 1

Related Questions