Заполнение значений в django-admin на основе выбора внешнего ключа - PullRequest
4 голосов
/ 16 марта 2011

У меня есть модель со ссылкой на внешний ключ, которая выглядит примерно так

class Plan(models.Model):
    template = models.ForeignKey(PlanTemplate)
    throttle = models.IntegerField(default=10)
    rate_limit = models.BigIntegerField(default=60)

и модель внешнего ключа:

class PlanTemplate(models.Model):
    name = models.CharField(max_length=50)
    throttle = models.IntegerField(default=10)
    rate_limit = models.BigIntegerField(default=60)

Я бы хотел, чтобы при выборе PlanTemplate были автоматически заполнены значения throttle и rate_limit на странице администрирования плана. Это легко сделать с помощью django-admin, или мне нужно переопределить шаблон администратора и добавить какой-нибудь пользовательский javascript?

Я использую Django 1.2.4.

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Я нашел способ сделать это, но он должен был включать JavaScript, который на самом деле был довольно простым. Я создал файл change_form.html в каталоге templates / admin / billing /, который выглядел следующим образом.

{% extends "admin/change_form.html" %}

{% block extrahead %}
    <script src="{{MEDIA_URL}}js/jquery.js" type="text/javascript"></script>
    <script type="text/javascript">
      $(document).ready(function() {
        $('#id_template').change(function() {
          $.ajax({
            type: 'POST',
            url: "{% url get_template_info %}",
            data: {'template_id': $('#id_template').val()},
            success: function(data, _status) {
              $('#id_throttle').val(data.throttle);
              $('#id_rate_limit').val(data.rate_limit);
              $('#id_product').val(data.product);
              $('#id_tier_group').val(data.tier_group);
            },
            dataType: "json"
          });               
        });
      });
    </script>
{% endblock %}

, который обращается к представлению, которое просто принимает переданный идентификатор, запрашивает его и возвращает его вызову. Работает как шарм.

0 голосов
/ 16 марта 2011

Это было бы легко сделать, если бы вы сделали это двухэтапным процессом.Возможно, имея add_view, который имеет только 1 поле, template.

В противном случае вам придется использовать JavaScript и настроить представление, которое возвращает данные шаблона.

Вот простое решение с использованием администратора модели и двухэтапной формы:

class MyAdmin(ModelAdmin):
    # ...

    def add_view(self, request, form_url='', extra_context=None):
        self.fields = ['template'] # add view has only 1 field.
        return super(MyAdmin, self).add_view(request, form_url, extra_context)

    def save_model(self, request, obj, form, change):
        if not change:
            # if adding... populate defaults.
            obj.throttle = obj.template.throttle
            obj.rate_limit = obj.template.rate_limit
            obj.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...