2017-08-09 6 views
1

Je suis en train de créer un champ d'autorisation utilisateur dans ma page Web en utilisant le formulaire django pour fonctionner exactement comme dans la page d'administration en utilisant FilterSelectMultiple. Actuellement, il remplit correctement les données et le bouton de sélection et de désélection fonctionne, mais je ne parviens pas à enregistrer le formulaire, chaque fois que je clique sur Enregistrer, l'actualisation de la page et tout l'utilisateur sont de nouveau désélectionnés.FilterSelectMultiple dans Django formulaire ne pas enregistrer

Le

user = forms.ModelMultipleChoiceField(queryset=Project.objects.all(), 
                widget=FilteredSelectMultiple('User', is_stacked=False)) 

ne fonctionne pas.

Comment puis-je résoudre ce problème? Toute aide est très appréciée merci

Ci-dessous mon code:

HTML:

<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" /> 
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css" /> 

<form method="POST" enctype="multipart/form-data" id=setting_form" name="setting_form" onsubmit="updateDiv()">{% csrf_token %} 

<!--USER--> 
    <div class="field"> 
     <label>User permissions:</label> 
     <div class="related-widget-wrapper"> 
     <select name="user_permissions" id="id_user_permissions" multiple="multiple" class="selectfilter" data-field-name="user permissions" data-is-stacked="0"> 
      <option value={{ form.user }}></option> 
     </select> 
    </div> 

    <div class="btn-toolbar pull-right"> 
     <div class="btn-group" role="group" aria-label="..."> 
      <input class="btn btn-success" type="submit" value="Save Changes"/> 
     </div> 
    </div> 
</form> 

<script 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> 

View.py

def project_setting(request): 
    form = EditProjectForm(request.POST or None, request.FILES or None, instance=selected_project, prefix='settings') 
    if form.is_valid(): 
     inst = form.save(commit=False) 
     inst.save() 
     form.save_m2m() 
     return HttpResponseRedirect('/dashboard/projects/{}/setting'.format(project_id)) 

    context = { 

     'form': form, 
    } 
    return render(request, 'dashboard/projects/setting.html', context=context) 

Form.py:

from django.contrib.admin.widgets import FilteredSelectMultiple 

class EditProjectForm(forms.ModelForm): 

    class Meta: 
     model = Project 
     fields = '__all__' 
     user = forms.ModelMultipleChoiceField(queryset=Project.objects.all(), 
               widget=FilteredSelectMultiple('User', is_stacked=False)) 

Model.py:

class Project(models.Model): 
    user = models.ManyToManyField(Employee, blank=True) 

EDIT:

Après avoir inspecté la source de la page, mon formulaire déclare comme celui-ci

<select name="user_permissions" id="id_user_permissions" multiple="multiple" class="selectfilter" data-field-name="user permissions" data-is-stacked="0"> 
     <option value=<select name="settings-user" id="id_settings-user" multiple="multiple"> 
     <option value="3">User A</option> 
     <option value="4">User B</option> 
    </select></option> 
</select> 

Son déclarant une autre <select> dans mon <select> tag

Répondre

1

Je ne suis pas familier avec ce widget, mais, il semble étrange de rendre le champ de l'utilisateur dans la balise d'option comme ça. Je ne vois pas non plus une balise de fermeture ou un bouton de soumission?

je l'aurais pensé que ce serait quelque chose comme:

<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" /> 
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css" /> 

<form method="POST" enctype="multipart/form-data" id=setting_form" name="setting_form" onsubmit="updateDiv()">{% csrf_token %} 

<!--USER--> 
    <div class="field"> 
     <label>User permissions:</label> 
     <div class="related-widget-wrapper"> 
     {{form.user}} 
    </div> 
    <input type="submit" value="save"> 
</form> 
<script 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> 
+0

Mes excuses, j'ai simplifié mon code et j'oublié d'ajouter le bouton d'envoi et la balise fermante, merci de le signaler, Oui , ma syntaxe originale était '{{form.user}}' mais le champ s'afficherait comme 'ManytoManyField' standard. Je voulais l'afficher en tant que 'FilteredSelectMultiple' –

+0

Alors en spécifiant' widget = FilteredSelectMultiple ('User', is_stacked = False) 'n'a eu aucun effet? –

+0

oui c'est correct, la raison pour laquelle il est affiché parce que je recréer les champs de sélection comme autorisation d'utilisateur de la page admin et changer la valeur, il devrait fonctionner mais il remplit et désélectionne correctement les données dans leur champ respectif J'essaie juste de comprendre comment enregistrer –