Как создать такую ​​же форму в группе и разрешения на шаблонах Django - PullRequest
0 голосов
/ 26 апреля 2019

Как я могу настроить свои шаблоны django, такие как страница группы администраторов, я пытался получить все поля, но он только выбирает доступные разрешения, а не выбирает выбранное поле разрешения. Помогите, спасибо

Поля, которые я хочу: введите описание изображения здесь

И затем я получу результаты: введите описание изображения здесь

Некоторые коды в формах:

class UserGroupForm(forms.ModelForm):
    class Meta:
        model = Group
        fields = '__all__'

Некоторый код в Views:

def save_all(request, form, template_name):
    data = dict()
    error = None
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            data['form_is_valid'] = True
            data['action'] = True
        else:
            data['form_is_valid'] = False
            error = form.errors

    context = {
        'form': form,
        'error': error,
    }
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)

def create(request):
    if request.method == 'POST':
        form = UserGroupForm(request.POST)
    else:
        form = UserGroupForm()
        form2 = UserPermissionForm()
    return save_all(request, form, 'usergroups/create.html')

Некоторый код в шаблонах:

<form action="" method="post" data-url="{% url 'userroles:create' %}" class="create-form">
    {% csrf_token %}
    <div class="modal-header">
        <h5 class="modal-title">Create Test</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
    </div>
    <div class="modal-body">
        {% if error %}
        <div class="alert alert-danger text-center" role="alert">
            {% for field, error in error.items %}
                {{ error | striptags }}
                <br>
            {% endfor %}
        </div>
        {% endif %}
        <div class="form-group">
            {{form}}
        </div>
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary">Save changes</button>
    </div>
</form>

Некоторый код в Ajax:

$(document).ready(function(){

    var ShowForm = function(){
        var btn = $(this);
        $.ajax({
            url: btn.attr('data-url'),
            type: 'get',
            dataType: 'json',
            beforeSend: function(){
                $('#modal-test').modal('show')
                django.jQuery('select.selectfilter, select.selectfilterstacked').each(function () {
                    var $el = $(this),
                        data = $el.data();
                    SelectFilter.init($el.attr('id'), data.fieldName, parseInt(data.isStacked, 10));
                });
            },
            success: function(data){
                django.jQuery('select.selectfilter, select.selectfilterstacked').each(function () {
                    var $el = $(this),
                        data = $el.data();
                    SelectFilter.init($el.attr('id'), data.fieldName, parseInt(data.isStacked, 10));
                });
                $('#modal-test .modal-content').html(data.html_form);
            }
        })
    };

    var SaveForm = function(){
        var form = $(this);
        $.ajax({
            url: form.attr('data-url'),
            data: form.serialize(),
            type: form.attr('method'),
            dataType: 'json',
            success: function(data){
                if(data.form_is_valid){
                    if(data.deleteData){
                        Swal.fire({
                            type: 'warning',
                            title: 'Your Data is Deleted',
                            showConfirmButton: false,
                            timer: 1500
                        }).then(function(){
                            window.location.href = ''
                        })
                    } else if(data.action) {
                        Swal.fire({
                            type: 'success',
                            title: 'Your action is success',
                            showConfirmButton: false,
                            timer: 1500
                        }).then(function(){
                            window.location.href = ''
                        })
                    }

                    $('#modal-test').modal('hide');
                    console.log('Yes')
                } else {
                    $('#modal-test .modal-content').html(data.html_form)
                    console.log('Not')
                }
            }
        })
        return false;
    }

    //create
    $('.show-form').click(ShowForm);
    $('#modal-test').on('submit', '.create-form', SaveForm);

    //update
    $(document).on('click', '.show-form-update', ShowForm);
    $('#modal-test').on('submit', '.update-form', SaveForm);

    //delete
    $(document).on('click', '.show-form-delete', ShowForm);
    $('#modal-test').on('submit', '.delete-form', SaveForm);

});

1 Ответ

0 голосов
/ 26 апреля 2019

Администратор Django использует filter_horizontal , чтобы показать разрешения.Чтобы адаптировать его, вы должны использовать FilteredSelectMultiple widget.

forms.py:

from django.contrib.auth.models import Group, Permission
from django.contrib.admin.widgets import FilteredSelectMultiple


class UserGroupForm(forms.ModelForm):
    class Meta:
        model = Group
        fields = '__all__'
        widgets = {
            'permissions': FilteredSelectMultiple("Permission", False, attrs={'rows':'2'}),
        }

и добавить сценарии / стили виджетов в ваш интерфейс (я просто скопировал и вставил всесценарии и стили со страницы администратора для django 2.2, поэтому некоторые из них, вероятно, не требуются):

create.html

<form action="" method="post" data-url="" class="create-form">
    {% csrf_token %}
    <div class="modal-header">
        <h5 class="modal-title">Create Test</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
    </div>
    <div class="modal-body">
        {% if error %}
        <div class="alert alert-danger text-center" role="alert">
            {% for field, error in error.items %}
                {{ error | striptags }}
                <br>
            {% endfor %}
        </div>
        {% endif %}
        <div class="form-group">
            {{form}}
        </div>
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary">Save changes</button>
    </div>
</form>
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css">
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css">


<script type="text/javascript" src="/admin/jsi18n/"></script>
<script type="text/javascript" src="/static/admin/js/vendor/jquery/jquery.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
<script type="text/javascript" src="/static/admin/js/core.js"></script>
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"></script>
<script type="text/javascript" src="/static/admin/js/SelectBox.js"></script>
<script type="text/javascript" src="/static/admin/js/actions.js"></script>
<script type="text/javascript" src="/static/admin/js/SelectFilter2.js"></script>
<script type="text/javascript" src="/static/admin/js/urlify.js"></script>
<script type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
<script type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.js"></script>

Если вы используете AJAX для получения HTML-формы, добавьте эти стилии скрипты для вашей главной HTML-страницы.После успешного вызова AJAX, вызовите следующий JavaScript.Этот код взят из SelectFilter2.js.

django.jQuery('select.selectfilter, select.selectfilterstacked').each(function () {
            var $el = $(this),
                data = $el.data();
            SelectFilter.init($el.attr('id'), data.fieldName, parseInt(data.isStacked, 10));
        });
...