2015-11-22 4 views
0

по какой-то причине я не могу просматривать страницы, на которых есть пуля без дефиса. Например:slug url не отображает URL-адреса, которые не имеют дефис

Это не работает: /example1

Это работает: /это-путь-работы

Я попытался изменить регулярные выражения, но не было никакой радости. Любая помощь будет оценена!

URLs

urlpatterns = patterns('', 
     url(r'^$', views.index, name='index'), 
     url(r'^register_profile/$', views.register_profile, name='register_profile'), 
     url(r'^update_profile/$', views.update_profile, name='update_profile'), 
     url(r'^create_project/$', views.CreateProject.as_view(), name='create_project'), 
     url(r'^(?P<username>\w+)/$', views.profile_page, name='user_profile'), 
     url(r'^(?P<slug>[-\w]+)/$', views.project_page, name='user_project'), 
     ) 

вид project_page

def project_page(request, slug): 

    context_dict = {} 

    username = request.user.username 
    user = get_object_or_404(User, username=username) 
    context_dict['project_user'] = user 

    project = UserProject.objects.get(slug=slug) 
    context_dict['project'] = project 

    context_dict['project_title'] = project.title 



    return render(request, 'howdidu/project.html', context_dict) 

модели

class UserProject(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=100) 
    project_overview = models.CharField(max_length=1000) 
    project_picture = models.ImageField(upload_to='project_images', blank=True) 
    date_created = models.DateTimeField(auto_now_add=True) 
    project_views = models.IntegerField(default=0) 
    project_likes = models.IntegerField(default=0) 
    project_followers = models.IntegerField(default=0) 
    slug = models.SlugField(max_length=100, unique=True) #should this be unique or not? 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.title) 
     super(UserProject, self).save(*args, **kwargs) 

    def __unicode__(self): 
     return self.title 

шаблон

{% extends 'howdidu/base.html' %} 

{% load staticfiles %} 

{% block title %}{{ profile_user.userprofile.first_name }} {{ profile_user.userprofile.second_name }}{% endblock %} 

{% block body_block %} 

     <h1>{{ profile_user.userprofile.first_name }}'s profile page</h1> 
     <img src="{{ profile_user.userprofile.profile_picture.url }}" width = "150" height = "150" /> 
     <h2>{{ profile_user.userprofile.first_name }} {{ profile_user.userprofile.second_name }}</h2> 
     <h2>{{ profile_user.userprofile.user_country }}</h2> 
     {% if projects %} 
      <ul> 
       {% for project in projects %} 
       <li><a href="{% url 'user_project' project.slug %}">{{ project.title }}</a></li> 
       {% endfor %} 
      </ul> 
     {% else %} 
      <strong>There are no projects present.</strong> 
     {% endif %} 

     {% if user.is_authenticated %} 
     {% if profile_user.username == user.username %} 
     <p><a href="{% url 'update_profile' %}">Edit profile</a></p> 
     <p><a href="{% url 'create_project' %}">Create new project</a></p> 
     {% endif %} 
     {% endif %} 




{% endblock %} 
+0

В конце вашего регулярного выражения есть '/'. Вы пытались '/ example1 /'? Когда вы сказали: «Это не работает», что происходит? у вас есть сообщение об ошибке? –

+0

Привет, да есть/в конце. Я получаю страницу с сообщением об ошибке не найденной 404. Ни один пользователь не отвечает заданному запросу. – ollysmall

+0

, потому что ваш пример не соответствовал никакому результату, и вы используете 'get_object_or_404', поэтому почему-то он вызывает ошибку« Http404 » –

ответ

0

Проблема в том, что вы заказываете URL.

url(r'^(?P<username>\w+)/$', views.profile_page, name='user_profile'), 
url(r'^(?P<slug>[-\w]+)/$', views.project_page, name='user_project'), 

Для этих Django нет большой разницы в Django. Django будет идти сверху вниз и найти первый матч. Если есть в - в вашем слизняк будет отображаться на

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

как это единственный URL, который соответствует -. Но если ваш пробковый example1 ссылка будет соответствовать

url(r'^(?P<username>\w+)/$', views.profile_page, name='user_profile'), 

URL, как это ближе к вершине. Что вам нужно сделать, так это добавить еще один «уровень» в URL. Например:

url(r'^users/(?P<username>\w+)/$', views.profile_page, name='user_profile'), 
url(r'^projects/(?P<slug>[-\w]+)/$', views.project_page, name='user_project'), 

Тогда все будет нормально работать.

P. S. Ваш URL не deppend на пользователя, чтобы фактически любой пользователь может видеть все проекты, я думаю, что это не то, что вы need.Think об этом для немного и спросить меня, если вам нужна помощь.

+0

СПАСИБО ВАС !!!!! Это решило! – ollysmall

+0

Если бы я хотел сделать имя пользователя ниже уровня ниже, как бы я это сделал?так что его вроде: www.example.com/username/project – ollysmall

+0

@ollysmall, да, так оно и выглядело. Я рад, что вы меня поняли. В основном вам просто нужно захватить как имя пользователя, так и проект, проверьте, является ли 'request.user' пользователем с именем пользователя и вызывает некоторую ошибку, если он не является. – pythad