2013-10-13 94 views
0

我想獲得一個特定的頁面URL並自動縮短網址,並顯示給用戶。在編寫下面的代碼後,它沒有正確縮短。在Django網址沒有縮短

頁面URL

127.0.0.1:8000/artlyf/1/topman 

頁網址縮短

127.0.0.1:8000/artlyf/1/topman/b 

Models.py

_char_map = string.ascii_letters+string.digits 

def index_to_char(sequence): 
    return "".join([_char_map[x] for x in sequence]) 

class Mrts(models.Model): 
    user=models.ForeignKey(User) 
    title=models.CharField(max_length=100) 
    picture_1=models.ImageField(upload_to="photos") 
    description=HTMLField(null=True,blank=True) 
    slug=models.SlugField(max_length=100, unique=True) 
    pub_date=models.DateTimeField() 

    def __unicode__(self): 
     return u'%s' %(self.title) 

    def get_short_id(self): 
      _id=self.id 
      digits=[] 
      while _id > 0: 
       rem= _id % 62 
       digits.append(rem) 
       _id /=62 
      digits.reverse() 
      return index_to_char(digits) 

    @staticmethod 
    def decode_id(string): 
     i=0 
     for c in string: 
      i=i*64+_char_map.index(c) 
     return i 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.slug=slugify(self.title) 
     super(Mrts,self).save(*args,**kwargs) 

Views.py

頁面的URL後要縮短

def artdetail(request,mrts_id,slug): 
     post=Mrts.objects.get(id=mrts_id,slug=slug) 

     currentUrl = request.build_absolute_uri(post.get_short_id()) 
     return render_to_response('postdetail.html',{'post':post, ' Mrts':Mrts,'currentUrl':currentUrl},context_instance=RequestContext(request)) 

Urls.py

url(r'^artlyf/(?P<mrts_id>\d+)/(?P<slug>[-\d\w]+)/$', 'artapp.views.artdetail', name='artdetail'), 

模板

{{currentUrl}} 

怎樣纔可以適當縮短?模型中可以用來縮短網址的任何好方法?

+0

我很難理解你能指望這個代碼來執行。您甚至沒有提供urls.py條目來縮短網址。 –

+0

對不起,縮短的網址需要輸入並且應該放在urls.py – picomon

+0

是的。我無法從你的文章中看出縮短的url應該是什麼樣子 - 它只是「/ short-id」還是「/ artlyf/short-id」或者完全不同的東西。 Django也不能。你需要一個urls.py條目來顯示,指向一個能夠處理簡短ID的視圖。 –

回答

1

您需要在urls.py縮短的URL模式的條目:爲獲得這兩種類型的URL的

url(r'^(?P<short_id>\w+)/$', 'artapp.views.artshort', name='artshort'), 
url(r'^artlyf/(?P<mrts_id>\d+)/(?P<slug>[-\d\w]+)/$', 'artapp.views.artdetail', name='artdetail') 
你的模型

和方法:

from django.core.urlresolvers import reverse 

class Mrts(models.Model): 
    # ... 

    def get_absolute_url(self): 
     return reverse('artdetail', args=[str(self.pk), self.slug]) 

    def get_short_url(self): 
     return reverse('artshort', args=[self.get_short_id()]) 

處理短網址的觀點(這個只是重定向到一個完整的網址):

from django.shortcuts import redirect, get_object_or_404 

def artshort(request, short_id): 
    id = Mrts.decode_id(short_id) 
    object = get_object_or_404(Mrts, pk=id) 
    return redirect(object) 

可以在這樣的一個模板顯示縮短的URL (其中postMrts對象):

{{ post.get_short_url }}