2014-08-28 2 views
0

привет Я хочу, чтобы получить доступ к значению поля в Django администратора формыДоступ к модели Field в admin.ModelAdmin в Django

model.py

from __future__ import absolute_import, division 
from django.db import models 
from django.utils.encoding import python_2_unicode_compatible 
@python_2_unicode_compatible 
class MySqlQuery(models.Model): 
    name = models.CharField(max_length=100) 
    query = models.TextField(max_length=1000) 

    class Meta: 
     verbose_name = 'SQL Query' 
     verbose_name_plural = 'SQL Queries' 
    def __str__(self): 
     return self.name 

admin.py

class MySqlQueryAdmin(admin.ModelAdmin): 

    list_display = ('query', 'name', 'action') 

    def get_urls(self): 
     urls = super(MySqlQueryAdmin, self).get_urls() 
     my_urls = patterns('', url(r"^execute/$", 
         self.admin_site.admin_view(self.execute_query))) 
     return my_urls + urls 

    def execute_query(self, request): 
     cursor = connection.cursor() 
     try: 
     #------------------------------------------ 
     #need to access query field from the models 
     #------------------------------------------ 
     cursor.execute(self.form.query) 
     except: 
     logger.error('query was not right') 
     finally: 
     cursor.close() 

     return HttpResponseRedirect(request.META['HTTP_REFERER']) 

    def action(self, form): 
     return "<a href='execute/'>execute</a>" 

    action.allow_tags = True 


admin.site.register(MySqlQuery, MySqlQueryAdmin) 

Я создал model.py, у которых есть запрос поля, я хочу выполнить запрос от администратора Django. Для чего мне нужно получить доступ к полю в форме администратора django.

ответ

0

Это не отличается от любого другого вида Django. Экземпляр MySqlQueryAdmin не ссылается ни на один из экземпляров MySqlQuery: это админ для всего класса модели, а не какой-либо конкретный экземпляр. Это означает, что невозможно получить «значение» экземпляра запроса без передачи идентификатора и получения объекта из базы данных с использованием этого идентификатора.

class MySqlQueryAdmin(admin.ModelAdmin): 

    list_display = ('query', 'name', 'action') 

    def get_urls(self): 
     urls = super(MySqlQueryAdmin, self).get_urls() 
     my_urls = patterns('', url(r"^execute/(?P<id>\d+)/$", 
         self.admin_site.admin_view(self.execute_query), name="execute")) 
     return my_urls + urls 

    def execute_query(self, request, id): 
     query = MySqlQuery.objects.get(id=id) 
     ... 

    def action(self, obj): 
     return "<a href='%s'>execute</a>" % reverse(admin:execute, kwargs={'id': obj.id}) 
    action.allow_tags = True 

Конечно, я бы не рекомендовал делать ничего подобного вообще, так как вы, кажется, выполнить произвольный предоставленный пользователем SQL против базы данных, но я думаю, вы уже знаете, риски этого.

+0

Спасибо за ответ, но я уже понял это. Как сделать курсор, выполняющий только запросы только для чтения? –

Смежные вопросы