Closed kartikdanidhariya closed 9 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.
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.
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?
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.
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?
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 :
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'
Closing the issue as it should answer your question. Feel free to tell me to re-open as needed.
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.
get_field method in admin.py it work properly for "list_display" but not work for "list_filter" and "search_fields"
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:
get_queryset
to build and return a language-aware queryset.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.
Ok Thanks.
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):
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