Как сделать так, чтобы запрос сообщения работал после использования 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. Это хорошая ссылка на то, что происходит с префиксным битом и должно помочь вам решить, делать ли все таким образом или с одной формой, как вы пытаетесь.