Как связать объект без ссылки OnoToOneRelation с соответствующей формой при получении request.POST?

#django #python-3.x #django-models #django-forms #foreign-keys

#django #python-3.x #django-модели #django-forms #внешние ключи

Вопрос:

У меня есть модель (разрешение), которая позволяет пользователю A предоставлять другому пользователю B некоторые разрешения, например, создавать событие для A, в повестке дня A. Каждый объект разрешений имеет два владельца внешнего ключа (user A) и authorized_user (user B) и логическое поле, соответствующее разрешениям. Пользователь A может иметь несколько разрешений, связанных с ним.

Моя проблема: поскольку поле владельца и поле авторизованного пользователя должны быть недоступны для редактирования или доступны только для чтения, я сталкиваюсь с некоторыми трудностями при попытке изменить разрешения.

В моем шаблоне html перечислены все формы или текущие разрешения.

Мои формы редактирования создаются только с логическим полем разрешения. Поэтому я не знаю , с каким экземпляром их нужно связать, когда мне нужно сохранить модификацию…

models.py :

 class Permission(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, editable=False)
    authorized_user = models.ForeignKey(User, on_delete=models.CASCADE, editable=False)

    can_create_event = models.BooleanField(default=False)
    can_edit_event = models.BooleanField(default=False)
  

По соображениям безопасности поля owner и authorized_user должны быть недоступны для редактирования (или доступны только для чтения).

Пример создания объектов :

     owner_user = User.obects.get(username = "User01")

    authorized_user_1 = User.obects.get(username = "User02")
    authorized_user_2 = User.obects.get(username = "User03")

    Permission.objects.create(owner = owner_user, authorized_user = authorized_user_1, 
    can_create_event=True, can_edit_event = False)
    <Permission: Permission from owner User01 linked to User02>

    Permission.objects.create(owner = owner_user, authorized_user = authorized_user_2,
    can_create_event=False, can_edit_event = True)
    <Permission: Permission from owner User01 linked to User03>
  

forms.py :

 class Edit_permission_Form(forms.ModelForm):
    class Meta:
        model = Permission
        fields = '__all__'
  

У меня есть представления, позволяющие владельцу объекта разрешений редактировать логическое поле.

views.py :

 @login_required()
def managepermission(request):
    if request.POST:
        permission_form = Edit_permission_Form(request.POST)
        if permission_form.is_valid():
            #I don't know how to link the form to the good instance
            permission_form.save()
            return redirect('manage')

    else:
        #Get all the permission object linked to the logged user
        actual_permissions = request.user.permission_set.all()

        #Get all the username of the authorized users (to display in the template)
        authorized_user_username = [permission.user.username for permission in actual_permissions]

        #Get all the permission id 
        #to allow the owner to delete the entry by clinking on the delete link
        permission_id = [permission.id for permission in actual_permissions]

        #Generate all the forms linked to the permission objects
        perm_edit_forms = [Edit_permission_Form(instance=perm) for perm in actual_permissions]

        #Store all the data in a dict
        data = {} 
        for i in range(len(actual_permission)):
            data[authorized_user_username[i]] = {
                "perm_id" : permission_id[i],
                "form" : perm_edit_forms[i],
            }

        return render(request, 'perm/manageperm.html', {'data': data}
  

manageperm.html :

 {% for key, value in data.items %}

    {{key}} <a href="/perm/delete_perm/{{value.perm_id}}">Delete</a>
    <form method="post" >
         {% csrf_token %}
         <table>
            {{value.form.as_table}}
             <tr>
                <td><input type="submit" name="submit" value="Modify"/></td>
            </tr>
         </table>
     </form>

{% endfor %}
  

Итак, есть ли у вас какие-либо идеи о том, как связать мою форму с правильным экземпляром, когда представления получают запрос POST?

Бонусный вопрос: как я могу более эффективно генерировать свой диктант данных?