2013-07-15 19 views
5

Bối cảnh: Tôi sử dụng django-hvad và có TranslatableModel. Trong số TranslatedFields Tôi có thuộc tính slug cần được tạo tự động bằng thuộc tính title khi lưu mô hình.django-hvad - làm cách nào để tôi đặt giá trị trường đã dịch trong khi lưu một phiên bản mẫu?

Sự cố: Rất khó đặt giá trị của một trong số TranslatedFields trong khi lưu phiên bản. Giải pháp hoạt động là ghi đè phương pháp save_translations của số TranslatableModel như sau. Chỉ dòng cuối cùng thứ hai khác với dòng gốc thứ hai:

@classmethod 
    def save_translations(cls, instance, **kwargs): 
     """ 
     The following is copied an pasted from the TranslatableModel class. 
     """ 
     opts = cls._meta 
     if hasattr(instance, opts.translations_cache): 
      trans = getattr(instance, opts.translations_cache) 
      if not trans.master_id: 
       trans.master = instance 
      # The following line is different from the original. 
      trans.slug = defaultfilters.slugify(trans.title) 
      trans.save() 

Giải pháp này không tốt, vì nó sử dụng sao chép và dán. Có cách nào tốt hơn để đạt được điều tương tự không?

Trả lời

6

Câu trả lời sau giả định rằng bạn đang sử dụng hệ thống quản trị để tự động tạo slug từ title. Điều này có thể hoặc có thể không phải là tình huống chính xác của bạn nhưng nó có thể có liên quan.

Đây là phần mở rộng của explanation trong các trang dự án Django-hvad.

Cách để triển khai đối tượng địa lý của bạn nằm trong tệp admin.py trong ứng dụng của bạn. Bạn cần mở rộng phương thức __init__() của lớp TranslatableAdmin.

Giả sử, ví dụ: mô hình của bạn được gọi là Entry. Mã đơn giản hóa trong models.py có thể là dọc theo dòng trong các cách sau: sau đó

from django.db import models 
from hvad.models import TranslatableModel, TranslatedFields 

class Entry(TranslatableModel): 
    translations = TranslatedFields(
     title=models.CharField(max_length=100,), 
     slug=models.SlugField(), 
     meta={'unique_together': [('language_code', 'slug')]}, 
    ) 
    def __unicode__(self): 
     return self.lazy_translation_getter('title') 

tập tin tương ứng admin.py của bạn nên thực hiện như sau:

from django.contrib import admin 

from hvad.admin import TranslatableAdmin 

from .models import Entry 

class EntryAdmin(TranslatableAdmin): 
    def __init__(self, *args, **kwargs): 
     super(EntryAdmin, self).__init__(*args, **kwargs) 
     self.prepopulated_fields = {'slug': ('title',)} 

admin.site.register(Entry, EntryAdmin) 
+0

Cảm ơn, dòng này đã khắc phục sự không tương thích giữa Haystack và Hvad, nơi Hvad buộc đối tượng phải được lưu trong giao diện quản trị và Haystack cố lập chỉ mục ngay lập tức trước khi dịch được viết. Chuẩn bị giá trị bằng cách sử dụng 'self.lazy_translation_getter ('title')' làm cho nó hoạt động cho tôi. – qris

0

Sử dụng django-hvad 1.5.0.

Trường hợp sử dụng: đặt giá trị của trường TranslatableModel bên ngoài Quản trị viên Django.

# self is a TranslatableModel instance with `translations` 
# this first line will initialize the cache if necessary 
slug = self.lazy_translation_getter('slug') 
translation = get_cached_translation(self) 
translation.master = self 
translation.slug = defaultfilters.slugify(self.title) # whatever value 
translation.save() 
Các vấn đề liên quan