2016-03-11 5 views
1

Я создал base.html в моем проекте Django, из которого я унаследовал остальную часть html-страниц. В моем base.html я создал навигационную панель, в которой отображаются «Главная», «О программе», «Контакты» и «[Myprofile и Logout]», если пользователь зашел в систему, он показывает [Регистрация]. Проблема заключается в том, что когда я вошел в систему на своей домашней странице, я вижу кнопку [Myprofile], но когда я нахожусь на странице контакта или о странице, кнопка на панели навигации [Myprofile] отсутствует, но [Logout] работает нормально.Nav Bar не работает должным образом - Django

Вот мой base.html

{% load staticfiles %} 

<!DOCTYPE html> 
<html> 
<head> 

    <title> 
    {% block title %} 
    WEB PAGE BY SHASHANK 
    {% endblock title %} 
    </title> 
    <link rel="stylesheet" href="{% static 'css/style.css' %}" /> 

</head> 
<body> 
     <div id="page"> 
     <div id="logo"> 
      <h1><a href="/" id="logoLink">S PORTAL</a></h1> 
     </div> 
     <div id="nav"> 
      <ul> 
       <li><a href="{% url 'home' %}">Home</a></li> 
       <li><a href="{% url 'about' %}">About</a></li> 
       <li><a href="{% url 'contact' %}">Contact</a></li> 

     {% if user.is_authenticated %} 
      <li><a href="{% url 'auth_logout' %}">Logout</a></li> 
      {% for thing in things %} 
       {% if user == thing.user %} 
        <li><a href="{% url 'thing_detail' slug=thing.slug %}">My Profile</a></li> 
       {% endif %} 
      {% endfor %} 


     {% else %} 
      <li><a href="{% url 'auth_login' %}">Login</a></li> 

     <li><a href="{% url 'registration_register' %}">Register</a></li> 
     {% endif %} 
     </ul> 
     </div> 


     {% block content %}{% endblock content %} 


     <div id="footer"> 
      <p> 
     Webpage made by <a href="/" target="_blank">SHASHANK</a> 
      </p> 
     </div> 
    </div> 
</body> 
</html> 

about.html

{% extends 'layouts/base.html' %} 
{% block title %} ABOUT - {{ block.super }}{% endblock title %} 



{% block content %} 

<h1>WHAT WE DO</h1> 

<div id="content"> 
      <h2>ABOUT</h2> 
      <p> 
       We are a new software development company. 
      </p> 
     <p>We are trying to change the world and expecting to getting paid for the same</p> 
      <p> 
      Visit us on our <a href="www.facebook.com"> Facebook </a> page. 
      </p> 
     </div> 
{% endblock content %} 

Urls.py

from collection.backends import MyRegistrationView 
from django.conf.urls import include, url 
from django.contrib import admin 
from collection import views 
from django.views.generic import TemplateView 
from django.contrib.auth.views import (
    password_reset, 
    password_reset_done, 
    password_reset_confirm, 
    password_reset_complete 
    ) 

urlpatterns = [ 
    url(r'^$', views.index, name='home'), 

    url(r'^about/$',TemplateView.as_view(template_name='about.html'),name='about'), 

    url(r'^contact/$',TemplateView.as_view(template_name='contact.html'),name='contact'), 

    url(r'^things/(?P<slug>[-\w]+)/$','collection.views.thing_detail',name='thing_detail'), 

    url(r'^things/(?P<slug>[-\w]+)/edit/$','collection.views.edit_thing',name='edit_thing'), 

    url(r'^things/(?P<slug>[-\w]+)/edit/weight$','collection.views.edit_weight',name='edit_weight'), 

    url(r'^things/(?P<slug>[-\w]+)/delete/weight$','collection.views.remove_weight',name='remove_weight'), 

    #WORKING url(r'^things/(?P<pk>\d+)/remove/$', 'collection.views.remove_weight', name='remove_weight'), 

    url(r'^things/$',TemplateView.as_view(template_name='weight_removed.html'),name='weight_removed'), 

    url(r'^(?P<slug>[\w\d-]+)/(?P<pk>\d+)/$','collection.views.remove_weight',name='remove_weight'), 






    #url(r'^edit/(?P<slug>\d+)/weights$', 'collection.views.AddWeight',name='AddWeight'), 
    # the new password reset URLs 
    url(r'^accounts/password/reset/$',password_reset,{'template_name':'registration/password_reset_form.html'},name="password_reset"), 
    url(r'^accounts/password/reset/done/$',password_reset_done,{'template_name':'registration/password_reset_done.html'},name="password_reset_done"), 
    url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',password_reset_confirm,{'template_name':'registration/password_reset_confirm.html'},name="password_reset_confirm"), 
    url(r'^accounts/password/done/$',password_reset_complete,{'template_name':'registration/password_reset_complete.html'},name="password_reset_complete"), 


    #setup additional registeration page 
    url(r'^accounts/register/$',MyRegistrationView.as_view(),name='registration_register'), 
    url(r'^accounts/create_thing/$','collection.views.create_thing',name='registration_create_thing'), 

    url(r'^accounts/',include('registration.backends.default.urls')), 
    url(r'^admin/', include(admin.site.urls)), 


] 

Views.py

from django.shortcuts import render,redirect,get_object_or_404 
from collection.models import Thing, Weight 
from collection.forms import ThingForm, WeightForm, ThingWeightFormSet 
from django.template.defaultfilters import slugify 
from django.contrib.auth.decorators import login_required 
from django.http import Http404 
from django.views.decorators.csrf import csrf_protect 
from django.views.generic import ListView, CreateView, UpdateView 
from django import forms 

def index(request): 
    things = Thing.objects.all() 
    return render(request,'index.html',{'things':things,}) 

def thing_detail(request, slug): 
    # grab the object... 
    thingRA = Thing.objects.get(slug=slug) 
    weights = thingRA.weights.all().order_by('-date') 
    # and pass to the template 
    return render(request, 'things/thing_detail.html', {'thing': thingRA, 'weights':weights,}) 

def edit_thing(request, slug): 
    # grab the object 
    thing = Thing.objects.get(slug=slug) 
    # set the form we're using 
    form_class = ThingForm 

    # if we're coming to this view from a submitted form 
    if request.method == 'POST': 
     # grab the data from the submitted form and apply to 
     # the form 
     form = form_class(data=request.POST, instance=thing) 
     if form.is_valid(): 
      # save the new data 
      form.save() 
      return redirect('thing_detail', slug=thing.slug) 
# otherwise just create the form 
    else: 
     form = form_class(instance=thing) 

# and render the template 
    return render(request, 'things/edit_thing.html', {'thing': thing,'form': form,}) 

def create_thing(request): 
    form_class = ThingForm 
    if request.method == 'POST': 
     form = form_class(request.POST) 
     if form.is_valid(): 
      thing = form.save(commit=False) 
      thing.user = request.user 
      thing.slug = slugify(thing.name) 
      thing.save() 
      slug = slugify(thing.name) 
      return redirect('thing_detail', slug=thing.slug) 
    else: 
     form = form_class() 

    return render(request,'things/create_thing.html', {'form': form,}) 


def edit_weight(request, slug): 
    thing = get_object_or_404(Thing, slug=slug) 
    if request.method == "POST": 
     form = WeightForm(request.POST) 
     if form.is_valid(): 
      weight = form.save(commit=False) 
      weight.thingRA = thing 
      weight.save() 
      return redirect('thing_detail', slug=thing.slug) 
    else: 
     form = WeightForm() 
    return render(request, 'things/edit_weight.html', {'form': form}) 

"""WORKING WEIGHT 
def remove_weight(request, pk): 
      weight = get_object_or_404(Weight, pk=pk) 
      thing_pk = weight.thingRA.pk 
      weight.delete() 
      return redirect('weight_removed') 
""" 


def remove_weight(request, pk, slug): 
      weight = get_object_or_404(Weight, pk=pk) 
      thing = get_object_or_404(Thing, slug=slug) 
      thing_pk = weight.thingRA.pk 
      weight.delete() 
      return redirect('thing_detail', slug=slug) 


@login_required 
def edit_thing(request, slug): 
    # grab the object... 
    thing = Thing.objects.get(slug=slug) 
    # make sure the logged in user is the owner of the thing 
    if thing.user != request.user: 
     raise Http404 
     # set the form we're using... 
    form_class = ThingForm 
    # if we're coming to this view from a submitted form, 
    if request.method == 'POST': 
     # grab the data from the submitted form and 
     # apply to the form 
     form = form_class(data=request.POST, instance=thing) 
     if form.is_valid(): 
      # save the new data 
      form.save() 
      return redirect('thing_detail', slug=thing.slug) 
    # otherwise just create the form 
    else: 
     form = form_class(instance=thing) 
     # and render the template 
    return render(request, 'things/edit_thing.html', {'thing': thing,'form': form,}) 
+0

вы должны добавить urls.py и фактическое вынесенное страницу тоже не шаблон только – maazza

+2

При визуализации 'about' страницы, я думаю, что вы забыли передать' things' параметр на стороне сервера , –

+0

@maazza Я добавил URLs.py –

ответ

1

Ваш профиль зависит от контекстной переменной: things, которая должна присутствовать на вашей домашней странице, но больше ничего. Я предположил бы, что у вас есть только одна вещь для каждого пользователя, так что вы либо должны просто использовать то или взять первый

{% for thing in things %} 
    {% if user == thing.user %} 
     <li><a href="{% url 'thing_detail' slug=thing.slug %}">My Profile</a></li> 
    {% endif %} 
{% endfor %} 

должен быть один из следующих:

  • Вещь имеет много-к -она связь с пользователем

    <li><a href="{% url 'thing_detail' slug=user.thing_set.first.slug %}">My Profile</a></li> 
    
  • вещь имеет отношение один к одному с пользователем

    <li><a href="{% url 'thing_detail' slug=user.thing.slug %}">My Profile</a></li> 
    
+0

Право, но, возможно, «thing_set» не относится к названию – maazza

+1

@maazza - '_set' является предметом django, чтобы найти много отношений ([docs] (https://docs.djangoproject.com/en/1.9/topics/db/query/# related-objects)), если у op есть связанное имя, то они могут использовать это. – Sayse

+1

, конечно, просто указывая, нам может понадобиться определение его моделей. – maazza

Смежные вопросы