Форма Django m2m сохраняет “через” таблицу

Цвет темы Ionic 4 можно найти в theme > variables.scss

Переменные Ionic CSS расположены внутри: root.

:root {
  --ion-color-primary: #3880ff;
  --ion-color-primary-rgb: 218,93,88;
  --ion-color-primary-contrast: #ffffff;
  --ion-color-primary-contrast-rgb: 255,255,255;
  --ion-color-primary-shade: #3171e0;
  --ion-color-primary-tint: #4c8dff;

...
}


ИСПОЛЬЗОВАНИЕ

Для элемента с тегом color.

<div color="primary"></div>
<div color="primary-shade"></div>
<div color="primary-tint"></div>

Для заданного class с использованием пользовательских цветовых свойств Ionic.

.class{
  color: var(--ion-color-primary);
}
.class{
  color: var(--ion-color-primary-shade);
}
.class{
  color: var(--ion-color-tint);
}
17
задан tshepang 17 December 2013 в 20:25
поделиться

4 ответа

В случае использования нормального отношения m2m (не через промежуточную таблицу) вы можете заменить:

membership = Membership(member = HERE SELECTED ITEMS FROM FORM,classroom=new_obj)
membership.save()

на

form.save_m2m()

Но в случае использования промежуточных таблиц вам необходимо вручную обработать данные POST и создать Объекты принадлежности со всеми обязательными полями ( аналогичная проблема ). Самое простое решение - изменить ваше представление на что-то вроде:

def save_classroom(request):
    if request.method == 'POST':
        form = ClassroomForm(request.POST, request.FILES)

        if form.is_valid():
           new_obj = form.save(commit=False)
           new_obj.user = request.user 
           new_obj.save()

           for member_id in request.POST.getlist('members'):
                membership = Membership.objects.create(member_id = int(member_id), classroom = new_obj)
           return HttpResponseRedirect('/')
    else:
        form = ClassroomForm()
    return render_to_response('save_classroom.html', locals())

Обратите внимание на то, как обрабатывается request.POST (.getlist). Это связано с тем, что post и get являются объектами QueryDict , что имеет некоторые последствия (request.POST ['members'] всегда будет возвращать один объект!).

Вы можете изменить этот код, чтобы сделать его более надежным (обработка ошибок и т. Д.) И более подробным, например:

member = get_object_or_404(User, pk = member_id)
membership = Membership.objects.create(member = member , classroom = new_obj)

Но обратите внимание, что вы выполняете некоторые запросы к базе данных в цикле, что в целом не является хорошей идеей ( с точки зрения производительности).

22
ответ дан 30 November 2019 в 12:50
поделиться

Как и в случае с dzida, но используйте form.cleaned_data вместо request.post:

def save_classroom(request):
    if request.method == 'POST':
        form = ClassroomForm(request.POST, request.FILES)

        if form.is_valid():
           new_obj = form.save(commit=False)
           new_obj.user = request.user
           new_obj.save()

           for member in form.cleaned_data['members'].all():
                Membership.objects.create(member = member,  classroom = new_obj)

           return HttpResponseRedirect('/')
    else:
        form = ClassroomForm()
    return render_to_response('save_classroom.html', locals())

Также необходимо учитывать, что некоторые членства могут быть удалены, поэтому:

def save_classroom(request):
    if request.method == 'POST':
        form = ClassroomForm(request.POST, request.FILES)

        if form.is_valid():
           new_obj = form.save(commit=False)
           new_obj.user = request.user
           new_obj.save()

           final_members = form.cleaned_data['members'].all()
           initial_members = form.initial['members'].all()

           # create and save new members
           for member in final_members:
                if member not in initial_members:
                    Membership.objects.create(member = member,  classroom = new_obj)

           # delete old members that were removed from the form
           for member in initial_members:
               if member not in final_members:
                   Membership.objects.filter(member = member, classroom = new_obj).delete()

           return HttpResponseRedirect('/')
    else:
        form = ClassroomForm()
    return render_to_response('save_classroom.html', locals())

Если вы используете формы моделей (как в общем CBV: form_class=ClassroomForm), переопределите и поместите логику сохранения выше в методе save, что-то вроде:

ClassroomForm(forms.ModelForm):
    members = ModelMultipleChoiceField(
        queryset=Classroom.objects.all(),
        widget=SelectMultiple
    )

    def save(self, commit=True):
        classroom = super().save(commit=False)
            if commit:
                classroom.save()
                if 'members' in self.changed_data:
                   final_members = self.cleaned_data['members'].all()
                   initial_members = self.initial['members']

                   # create and save new members
                   for member in final_members:
                        if member not in initial_members:
                            Membership.objects.create(member = member,  classroom = new_obj)

                   # delete old members that were removed from the form
                   for member in initial_members:
                       if member not in final_members:
                           Membership.objects.filter(member = member, classroom = new_obj).delete()

         return classroom
5
ответ дан 30 November 2019 в 12:50
поделиться

Вот как я это сделал в универсальном представлении на основе классов UpdateForm (django 1.8) для аналогичного, но другого приложения, используя метод form_valid.

def form_valid(self, form):
    """
    If the form is valid, save the associated model.
    """
    self.object.members.clear()
    self.object = form.save(commit=False)
    self.object.user = self.request.user 
    self.object.save()

    list_of_members = form.cleaned_data['members']

    ClassRoom.objects.bulk_create([
            Membership(
                Course=self.object,
                member=member_person,
                order=num)
            for num, member_person in enumerate(list_of_members)
        ])
    return super(ModelFormMixin, self).form_valid(form)
0
ответ дан 30 November 2019 в 12:50
поделиться

Вам также необходимо указать класс для членства:

membership = Membership(member = request.user,
                        classroom=new_obj) #if new_obj if your classroom
membership.save()

Думаю, вам также следует удалить пользователя в accept = models.BooleanField (User) . Нет необходимости устанавливать дату при сохранении, если вы используете auto_now ! Но, возможно, вам больше подходит `auto_now_add '( http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.DateField )

1
ответ дан 30 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: