Как автоматически заполнять поля в определенной форме - PullRequest
0 голосов
/ 26 октября 2019

Я разрабатываю приложение django для отслеживания заказов и продуктов в моей лаборатории. У меня есть модель Order, из которой я создаю экземпляры с формой, которая заполняет некоторые из ее полей (но не все) и создает объект. Я также создал UpdateForm для обновления пустых полей, как только заказ поступит в лабораторию. Эта форма обновления имеет только одно поле (место хранения), но я хочу, чтобы эта форма автоматически устанавливала статус заказа на «полученный» и заполняла поле «receive_by» зарегистрированным пользователем и «receive_date» с dateTime, когда формаотправлено ..

При написании этого я просто подумал, что мог бы создать другую модель для получения и связать ее с моделью заказа через OnetoOne, будет ли это правильным решением?

Как мой кодвыглядит так:

#models.py-------------------------------------------------------------
class Pedido(models.Model):
    nombre = models.CharField(max_length=40, help_text=_('Nombre del producto.'))
    referencia = models.CharField(max_length=20, help_text=_('Referencia del fabricante.'))
    cpm = models.CharField(max_length=20, default ='A la espera.',help_text=_('Código del CPM asignado a este pedido.'), null = True, blank = True, verbose_name = _('CPM'))
    fecha = models.DateTimeField(auto_now_add=True)
    unidades = models.IntegerField(default = 1)
    usuario = models.ForeignKey(User, on_delete=models.CASCADE, blank = True)
    autogestion = models.BooleanField(default = False, verbose_name='Autogestión', help_text = _("Marca esta casilla si vas a procesar tu mismo el pedido."))
    usuario_recepcion = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='recepcion')
    fecha_recepcion = models.DateTimeField(blank=True, null=True)

    ESTADO_PEDIDO = (
        ('n', _('Pendiente')),
        ('p', _('Proforma solicitada')),
        ('c', _('CPM solicitado')),
        ('v', _('Para validar')),
        ('r', _('Recibido'))
    )

    estado = models.CharField(
        max_length=1,
        choices=ESTADO_PEDIDO,
        blank=False,
        default='n',
        help_text=_('Estado del pedido'),
    )

    fabricante = models.ForeignKey('Fabricante', null = True, on_delete=models.SET_NULL)
    centro_gasto = models.ForeignKey('CentroGasto', null = True, on_delete=models.SET_NULL, verbose_name = _('Centro de Gasto'))
    almacen = models.ForeignKey('Almacen', null = True, on_delete=models.SET_NULL, blank = True)
    direccion = models.ForeignKey('Direccion', default = 'CIBM', null = True, on_delete=models.SET_NULL, verbose_name = _('Dirección de entrega'))
    codigo = models.CharField(max_length=20, blank=True, default=keygen())

#views.py----------------------------------------------------------
class PedidoListView(LoginRequiredMixin, generic.ListView):
    model = Pedido
    ordering = ['-fecha']

class PedidoDetailView(LoginRequiredMixin, generic.DetailView):
    model = Pedido

@login_required
def Guia(request):
    return render(request, 'guia.html')

@login_required
def add_pedido(request):
    if request.method == "POST":
        form = PedidoForm(request.POST)
        if form.is_valid():
            model_instance = form.save(commit=False)
            model_instance.usuario = request.user
            model_instance.save()
            return redirect('/')

    else:
        form = PedidoForm()
        return render(request, "nuevo_pedido.html", {'form': form})

class RecepcionUpdate(LoginRequiredMixin, UpdateView):
    model = Pedido
    fields = ['almacen']
    template_name_suffix = '_recepcionar'

#forms.py-----------------------------------------------------------------
class PedidoForm(ModelForm):
    def clean_usuario(self):
        if not self.cleaned_data['usuario']:
            return User()
        return self.cleaned_data['user']

    class Meta:
        model = Pedido
        exclude = ['codigo', 'fecha', 'cpm', 'almacen', 'estado', 'usuario']

1 Ответ

0 голосов
/ 27 октября 2019

Если вы пытаетесь изменить предопределенный класс в Django, его всегда можно перезаписать. Например, вы можете расширить метод form_valid:

class RecepcionUpdate(LoginRequiredMixin, generic.UpdateView):
    model = Pedido
    fields = ['almacen']
    template_name_suffix = '_recepcionar'

    def form_valid(self, form):
        instance = form.save(commit=False)
        instance.user = self.request.user
        super(RecepcionUpdate, self).save(form)

Примечание: я не проверял это, вероятно, вместо того, чтобы вызывать super().save(form), вы должны return super().form_valid(form). В любом случае, я уверен, что в этом примере вы сможете найти множество фрагментов кода, соответствующих вашей версии Django.

...