Как сделать так, чтобы запрос сообщения работал после использования get_queryset?

Я хотел бы иметь список устройств пользователя с флажком рядом с каждым из них. Пользователь может выбрать устройства, которые он хочет просмотреть на карте, нажав на соответствующие флажки, а затем нажав кнопку отправки. Я не включаю в этот вопрос картографическую часть, потому что планирую разобраться с этим позже. Шаг, который сейчас вызывает проблемы, - это попытка использовать пост-запрос.

Для того чтобы пользователь мог видеть только те устройства, которые ему назначены, я использую метод get_queryset. Я видел пару вопросов об использовании post request вместе с методом get_queryset, но они, похоже, не работают для меня. Используя вид ниже, когда я выбираю флажок, а затем нажимаю submit, похоже, что происходит post-запрос, за которым сразу же следует get-запрос, и в результате моя таблица пуста, когда страница загружается.

Часть моего файла views.py:


class DeviceListView(LoginRequiredMixin, ListView):
    model = Device
    template_name = 'tracking/home.html'
    context_object_name = 'devices'

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(who_added=self.request.user)       

    def post(self, request):
        form = SelectForm(request.POST)   
        return render(request, self.template_name, {'form': form})


Части моего шаблона:

Думаю, вам лучше использовать представление на основе функций с типичной логикой "if request.method = POST", это не совсем то, для чего нужно общее представление списка.

@loginrequired
def device_list_view(request):
    context = {}
    if request.method = POST:
        form = SelectForm(request.POST)
        if form.is_valid():
            # if a request was posted and is valid, do your thing:
            # maybe your thing is to give your map view the device id
            # and render it
            # assuming your form has a field called device_id:
            context['device_id'] = form.device_id 
            return render(request, 'tracking/device_map.html', context)
   
    # either request method is not post or the form wasn't valid
    user_devices = Device.objects.filter(who_added=request.user)
    device_forms = []
    for i, device in enumerate(user_devices):
        form = SelectForm(instance=device, prefix=i)
        device_forms.append(form)
   context['device_forms'] = device_forms
  return render(request, 'tracking/home.html', context)
    

Ключевой частью здесь является логика if-else проверки того, был ли запрос POST или нет, вам нужно будет настроить ее в зависимости от того, что именно вы хотите, чтобы произошло. Похоже, что на самом деле вы создаете одну форму, из которой извлекаете несколько device_ids. Это хорошая ссылка на то, что происходит с префиксным битом и должно помочь вам решить, делать ли все таким образом или с одной формой, как вы пытаетесь.

Вернуться на верх