Как правильно «запросить» у пользователя значение, основанное на логике в views.py в Django? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь изменить страницу, которая отслеживает, когда пользователи входят / выходят из области. В настоящее время вся логика работает нормально, но я хотел бы добавить функциональность, чтобы попросить пользователя ввести свою собственную «оценку» времени, которое он ввел / оставил, в случае, если он забыл это сделать, поскольку эти экземпляры помечаются при отправке. Я довольно новичок в Django / Python, и у меня есть общее представление о том, как все это работает, поэтому я заранее извиняюсь, если мои предложения по работе с этим немного не верны.

Это обобщенная версияиз того, как выглядят модели:

models.py

class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
    employee_number = models.ForeignKey(Salesman, on_delete=models.SET_NULL, help_text="Employee #", null=True, blank=False)
    work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False, help_text="Work Area", related_name="work_area")
    station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, help_text="Station", related_name="stations", blank=True)
    edited_timestamp = models.DateTimeField(null=True, blank=True)
    time_exceptions = models.CharField(max_length=2, blank=True)
    time_in = models.DateTimeField(help_text="Time in", null=True, blank=True)
    time_out = models.DateTimeField(blank=True, help_text="Time out", null=True)

    def __str__(self):
        return self.employee_number

Я подумал, что самый простой способ сделать это - добавить его в логику в представлениях. py, чтобы предотвратить обновление неправильной записи таким образом, чтобы сразу после того, как запись была помечена, пользователю предлагается ввести дату / время, которое, по его оценкам, они вошли в область.

Чтобы код был читабельным, я показываю только случай, когда записи помечены. Если кто-то пытается войти в какую-либо область, забывает выйти и затем пытается снова войти в область, запись без выхода немедленно помечается (флаг time_exceptions = 'N').

views.py

class EnterExitArea(CreateView):
    model = EmployeeWorkAreaLog
    template_name = "operations/enter_exit_area.html"
    form_class = WarehouseForm

    def form_valid(self, form):
        emp_num = form.cleaned_data['employee_number']
        area = form.cleaned_data['work_area']
        station = form.cleaned_data['station_number']

        if 'enter_area' in self.request.POST:
            form.save()
            EmployeeWorkAreaLog.objects.filter((Q(employee_number=emp_num) & Q(work_area=area) & Q(time_out__isnull=True) & Q(time_in__isnull=True)) & (Q(station_number=station) | Q(station_number__isnull=True))).update(time_in=datetime.now())

            # If employee has an entry without an exit and attempts to enter a new area, mark as an exception 'N'
            if EmployeeWorkAreaLog.objects.filter(Q(employee_number=emp_num) & Q(time_out__isnull=True) & Q(time_exceptions="")).count() > 1:
                first = EmployeeWorkAreaLog.objects.filter(employee_number=emp_num, time_out__isnull=True).order_by('-time_in').first()
                EmployeeWorkAreaLog.objects.filter((Q(employee_number=emp_num) & Q(time_out__isnull=True))).exclude(pk=first.pk).update(time_exceptions='N')

            # Here would be the rendering of the page, maybe as a popup? and then saving the entered field using edited = form.cleaned_data['edited_timestamp'] and then saving it using .update()

            return HttpResponseRedirect(self.request.path_info)

Я пытался сделать это таким образом, чтобы вместо перенаправления на ту же страницу, было бы что-то похожее на страницуниже, который просто запрашивает время и после того, как пользователь отправляет, он сохраняет его в поле "edited_timestamp" записей.

update_edited_timestamp.html

<div>
    <form id="warehouseForm" action="" method="POST" class="form-horizontal">
        <label>Enter estimated time:</label>
        <input value="html()" type="datetime-local" name="edited_timestamp">
    </form>
</div>

Добавление моей главной HTML-страницы, где все это происходит на всякий случай

enter_exit_area.html

{% extends "operations/base.html" %}

{% block main %}
    <form id="warehouseForm" action="" method="POST" class="form-horizontal" novalidate >
        {% csrf_token %}

        <div>
            <div>
                <div style="color: red">{{ form.employee_number.errors.as_text }}</div>
                <label>Employee</label>
                {{ form.employee_number }}
            </div>

            <div>
                <div style="color: red">{{ form.work_area.errors.as_text }}</div>
                <label>Work Area</label>
                {{ form.work_area }}
            </div>
            <div style="color: red">{{ form.station_number.errors.as_text }}</div>
            <div>
                <label>Station</label>
                {{ form.station_number }}
            </div>
        </div>

        <div>
            <div>
                <button type="submit" name="enter_area" value="Enter">Enter Area</button>
                <button type="submit" name="leave_area" value="Leave">Leave Area</button>
            </div>
        </div>
    </form>
{% endblock main %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...