KristianOellegaard / django-hvad

Painless translations in django, using the regular ORM. Integrates easily into existing projects and apps. Easy convertible from django-multilingual-ng.
https://github.com/KristianOellegaard/django-hvad
Other
533 stars 127 forks source link

How i access untraslated field in admin.py #201

Closed kartikdanidhariya closed 9 years ago

kartikdanidhariya commented 10 years ago

I am using django-hvad for django project . but now i am in trouble please help,

In my django models.py there are two fields, as shown below

class Subject(TranslatableModel): translations = TranslatedFields( element = models.BooleanField(verbosename =('has Subject Element')), credit = models.PositiveIntegerField(verbosename =('Credits'),blank=True, null=True), )

How i access field in admin.py

class MyAdmin(admin.ModelAdmin):

def get_readonly_fields(self, request, obj=None):
    if obj and obj.element == True:
        return self.readonly_fields + ['credit',]
    return self.readonly_fields

It show following error

WrongManager at /en/admin/subject/subject/

To access translated fields like 'subject_nm' from an untranslated model, you must use a translation aware manager, you can get one using nani.utils.get_translation_aware_manager.

How can i resolve this, i search a lot but can't find a solution

spectras commented 10 years ago

Hello, I am in a hurry right now so I will be short. For translatable models, hvad should provide you with TranslatableAdmin, in hvad.admin module. Please have a look there: http://django-hvad.readthedocs.org/en/latest/public/admin.html This should get you going I'm sorry I have but a few minutes.

kartikdanidhariya commented 10 years ago

i used

class MyAdmin(TranslatableAdmin,FrontendEditableAdmin,PlaceholderAdmin,admin.ModelAdmin):

def get_readonly_fields(self, request, obj=None):
    if obj and obj.element == True:
         return self.readonly_fields + ['credit',]
   return self.readonly_fields

but still give error,

WrongManager at /en/admin/subject/subject/

To access translated fields like 'subject_nm' from an untranslated model, you must use a translation aware manager, you can get one using nani.utils.get_translation_aware_manager.

spectras commented 10 years ago

What is subject_nm? I don't see this field in your definition yet it must be created in some way. Do you have other things in your admin class definition?

kartikdanidhariya commented 10 years ago

subject_nm is field in my models.py That Error cause when i try to access subject_nm field Actually ,i show you only some fields of my models.py my whole models.py is

class SubjectManager(TranslationManager):

translations = TranslatedFields(
        course = models.ForeignKey('course.Course'),
        subject_nm = models.CharField(max_length=100, verbose_name =_('Subject Name')),
        code = models.CharField(max_length=20, verbose_name =_('Subject Code')),
        sem = models.CharField(max_length=15, verbose_name =_('Semester'), choices=SEM_CHOICES),
        element = models.BooleanField(verbose_name =_('has Subject Element')),
        cm = models.PositiveIntegerField(verbose_name =_('CM')),
        td = models.PositiveIntegerField(verbose_name =_('TD')),
        tp = models.PositiveIntegerField(verbose_name =_('TP')),
        ti = models.PositiveIntegerField(verbose_name =_('TI')),
       credit = models.PositiveIntegerField(verbose_name =_('Credits'),blank=True, null=True),
       des = models.TextField(verbose_name = _('Description')),
       files = models.FileField(upload_to='uploads_file/', blank=True, null=True),
       title = models.CharField(max_length=512, verbose_name=_('Title')),
       slug = models.SlugField(max_length=512, verbose_name=_('Slug')),
       created_date = models.DateTimeField(auto_now_add=True, blank=True, null=True),
       updated_date = models.DateTimeField(auto_now=True, blank=True, null=True),
       created_by = models.ForeignKey(User,blank=True, null=True, editable=False, related_name='subject_user_ceated'),
       updated_by = models.ForeignKey(User,blank=True, null=True, editable=False, related_name='subject_user_updated')    
)

My admin.py is class SubjectAdmin(TranslatableAdmin, FrontendEditableAdmin, PlaceholderAdmin, admin.ModelAdmin): list_display = ['get_subject', 'get_course', 'get_sem', 'all_translations']

def get_readonly_fields(self, request, obj=None):

 if obj and obj.element == True:
     return self.readonly_fields + ['credit',]
return self.readonly_fields

it cause error ,

WrongManager at /en/admin/subject/subject/4/

To access translated fields like 'credit' from an untranslated model, you must use a translation aware manager, you can get one using nani.utils.get_translation_aware_manager.

spectras commented 10 years ago

Alright. Could you also post the full stack trace so I have the opportunity to spot the exact point at which the exception is raised?

kartikdanidhariya commented 10 years ago

OK here is my full stack trace

Environment:

Request Method: GET Request URL: http://127.0.0.1:8000/en/admin/subject/subject/3/

Django Version: 1.5.1 Python Version: 2.7.3 Installed Applications: ('django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', 'django.contrib.admindocs', 'south', 'fedenadata', 'registration', 'profiles', 'cms', 'mptt', 'menus', 'south', 'sekizai', 'easy_thumbnails', 'cms.plugins.flash', 'cms.plugins.googlemap', 'cms.plugins.link', 'cms.plugins.text', 'filer', 'cmsplugin_filer_file', 'cmsplugin_filer_folder', 'cmsplugin_filer_image', 'cmsplugin_filer_teaser', 'cmsplugin_filer_video', 'hvad', 'vrs_image_slider', 'vrs_widget_slider', 'vrs_image_gallery', 'multilingual_news', 'degree', 'domain', 'course', 'subject', 'major', 'exam', 'college', 'subject_element') Installed Middleware: ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.doc.XViewMiddleware', 'cms.middleware.page.CurrentPageMiddleware', 'cms.middleware.user.CurrentUserMiddleware', 'cms.middleware.toolbar.ToolbarMiddleware', 'cms.middleware.language.LanguageCookieMiddleware')

Template error: In template /home/keyur/fedena_django/local/lib/python2.7/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 7 To access translated fields like 'credit' from an untranslated model, you must use a translation aware manager, you can get one using nani.utils.get_translation_aware_manager. 1 :

2 : {% if fieldset.name %}

{{ fieldset.name }}

{% endif %}

3 : {% if fieldset.description %}

4 :

{{ fieldset.description|safe }}

5 : {% endif %}

6 : {% for line in fieldset %}

7 :

8 : {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}

9 : {% for field in line %}

10 : <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}>

11 : {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}

12 : {% if field.is_checkbox %}

13 : {{ field.field }}{{ field.label_tag }}

14 : {% else %}

15 : {{ field.label_tag }}

16 : {% if field.is_readonly %}

17 :

{{ field.contents|linebreaksbr }}

Traceback: File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response

  1. response = response.render() File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/response.py" in render
  2. self.content = self.rendered_content File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/response.py" in rendered_content
  3. content = template.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  4. return self._render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in _render
  5. return self.nodelist.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  6. bit = self.render_node(node, context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  7. return node.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  8. return compiled_parent._render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in _render
  9. return self.nodelist.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  10. bit = self.render_node(node, context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  11. return node.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  12. return compiled_parent._render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in _render
  13. return self.nodelist.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  14. bit = self.render_node(node, context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  15. return node.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  16. return compiled_parent._render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in _render
  17. return self.nodelist.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  18. bit = self.render_node(node, context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  19. return node.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  20. result = block.nodelist.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  21. bit = self.render_node(node, context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  22. return node.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  23. result = block.nodelist.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  24. bit = self.render_node(node, context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  25. return node.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  26. nodelist.append(node.render(context)) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  27. return self.render_template(self.template, context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render_template
  28. output = template.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  29. return self._render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in _render
  30. return self.nodelist.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/base.py" in render
  31. bit = self.render_node(node, context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
  32. return node.render(context) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  33. nodelist.append(node.render(context)) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  34. values = list(values) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/contrib/admin/helpers.py" in iter
  35. model_admin=self.model_admin) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/contrib/admin/helpers.py" in init
  36. label = label_for_field(field, form._meta.model, model_admin) File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/django/contrib/admin/util.py" in label_for_field
  37. field = model._meta.get_field_by_name(name)[0] File "/home/keyur/fedena_django/local/lib/python2.7/site-packages/hvad/utils.py" in call
  38. name)

Exception Type: WrongManager at /en/admin/subject/subject/3/ Exception Value: To access translated fields like 'credit' from an untranslated model, you must use a translation aware manager, you can get one using nani.utils.get_translation_aware_manager.

spectras commented 9 years ago

Alright, maybe I have a solution for you. The issue is a limitation on the internal workings of the admin app prevents using translatable fields directly. You have to use a getter method for this, like this:


def get_readonly_fields(self, request, obj=None):
    if obj and obj.element == True:
        return self.readonly_fields + ['get_credit',]
    return self.readonly_fields

def get_credit(self, obj=None):
    return obj.credit
get_credit.short_description = u'credit'
spectras commented 9 years ago

Closing the issue as it should answer your question. Feel free to tell me to re-open as needed.

kartikdanidhariya commented 9 years ago

Sorry for reply very late but this solution not working for me because i want to put "search_field" (for put search box in admin) and "list_filter "(for make filter in admin) for translated field in admin.py ,when i pass through get_field method so it can't take as a parameter .it shows following error, Cannot resolve keyword 'translation_title' into field

so,please tell me how can i directly access translated field in admin.py without any get_field method also give me reply it needed for create new issue for this or not.

kartikdanidhariya commented 9 years ago

get_field method in admin.py it work properly for "list_display" but not work for "list_filter" and "search_fields"

spectras commented 9 years ago

Unfortunately, it is not possible for Django admin to access a translated field. There are limitations in the way it checks for fields that make it impossible. You can check #187 for more details. This is the reason we have to work around Django admin's limitations by using a getter method.

It works for list_display, and you can have ordering as well like this: get_credit.admin_order_field = 'credit'

Unfortunately, filtering is not as easy to get working right. By default, the admin uses an untranslated queryset so it can display all objects, even if they have no translation in current language. Therefore, being untranslated, it has no access to translated fields. You have two options you can try:

  • Override get_queryset to build and return a language-aware queryset.
  • Or use search_filters = ('translations__title',). Beware that this code relies on an internal implementation detail of hvad, and is likely to break if at some point we manage to find a clean solution to this issue.

In any case, remember that objects with no translation in current language will not show up in the admin if you filter against a translated field. Please tell me if it helps.

kartikdanidhariya commented 9 years ago

Ok Thanks.