Используйте django formset только для нескольких определенных полей

Я относительно новичок в django (около 3 месяцев использую его) и столкнулся со следующей проблемой на работе. У меня есть модель с несколькими полями, и они спросили меня, что из этих полей, 4 конкретно должны иметь возможность динамически добавлять другой регистр, то есть, если я регистрирую что-то в одном из этих полей, должна быть возможность делать это снова бесконечно. Я понимаю, что этого можно достичь с помощью formset, но все примеры, которые я нахожу, используют все поля модели, а не только несколько. Есть идеи, что я могу сделать?

это модель

class Mercancia(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
id = models.AutoField(primary_key=True)
factura = models.ForeignKey("Factura", on_delete=models.CASCADE)
desc_mercancia = models.CharField(max_length=256, validators=[RegexValidator(r'^[0-9a-zA-Z\s]*$', 'La descripción de la mercancia no acepta caracteres especiales.')])
comercio = models.ForeignKey("ClaveComercio", on_delete=models.CASCADE)
tipo_moneda = models.ForeignKey("Moneda", on_delete=models.CASCADE)
cantidad_comerc = models.DecimalField(max_digits=30, decimal_places=0)
valor_unitario = models.DecimalField(max_digits=22, decimal_places=6, validators=[MinValueValidator(0)])
valor_total = models.DecimalField(max_digits=22, decimal_places=6, validators=[MinValueValidator(0)])
valor_total_dolares = models.DecimalField(max_digits=20, decimal_places=4, validators=[MinValueValidator(0)])
marca = models.CharField(blank = True, max_length=35, validators=[RegexValidator(r'^[0-9a-zA-Z\s]*$', 'El modelo solo permite valores alfanuméricos.')])
modelo = models.CharField(blank = True, max_length=50, validators=[RegexValidator(r'^[0-9a-zA-Z\s]*$', 'El modelo solo permite valores alfanuméricos.')])
submodelo = models.CharField(blank=True, max_length=50, validators=[RegexValidator(r'^[0-9a-zA-Z\s]*$', 'El submodelo solo permite valores alfanuméricos.')])
numero_serie = models.CharField(blank = True, max_length=25, validators=[RegexValidator(r'^[0-9a-zA-Z\s]*$', 'El numero de serie solo permite valores alfanuméricos.')])
history = HistoricalRecords()
created_by = models.ForeignKey('catalogos_modular.User', related_name='+', on_delete=models.CASCADE)
updated_by = models.ForeignKey('catalogos_modular.User', related_name='+', on_delete=models.CASCADE, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True, null=True)

class Meta:
    # verbose_name = "Mercancia"
    # verbose_name_plural = "Mercancias"
    db_table = "fac_mercancia"
    ordering = ['-id']

view

class CreateMercancia(CreateView):
model = Mercancia
template_name = "mercancias/create.html"
form_class = MercanciaForm
  
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context["mercancia"] = self.model.objects.filter(factura=self.kwargs['pk']).values()
    moneda = Moneda.objects.all()
    
    for merch in context['mercancia']:
        for mon in moneda:
            if merch['tipo_moneda_id'] == mon.id:
                merch['tipo_moneda_id'] = mon.name
    context["id_anterior"] = self.kwargs['pk']
    return context

def get_form_kwargs(self, *args, **kwargs):
    form_kwargs = super().get_form_kwargs(*args, **kwargs)
    user = self.request.user
    form_kwargs['user'] = user
    return form_kwargs

def get_success_url(self):
    return reverse_lazy('facturas:createMercancias', kwargs={'pk':self.kwargs['pk']})

form

class MercanciaForm(forms.ModelForm):
class Meta:
    model = Mercancia
    fields = '__all__'
    exclude = ('created_by','updated_by','is_deleted','deleted_at')
    widgets = {
        'desc_mercancia': forms.TextInput(attrs={'placeholder': 'Descripcion de la mercancia'}),
        'tipo_moneda': forms.Select(),
        'cantidad_comerc': forms.NumberInput(attrs={'placeholder': 'Cantidad de unidades de comercialización'}),
        'valor_unitario': forms.TextInput(attrs={'placeholder': 'Valor unitario'}),
        'valor_total': forms.TextInput(attrs={'placeholder': 'Valor total'}),
        'valor_total_dolares': forms.TextInput(attrs={'placeholder': 'Valor total en dolares'}),
        'marca': forms.TextInput(attrs={'placeholder': 'Marca'}),
        'modelo': forms.TextInput(attrs={'placeholder': 'Modelo'}),
        'submodelo': forms.TextInput(attrs={'placeholder': 'Submodelo'}),
        'numero_serie': forms.TextInput(attrs={'placeholder': 'Número de serie'}),
        'consecutivo_merc' : forms.TextInput(attrs={'readonly': 'readonly'}),
        
    }

    labels = {
        'desc_mercancia':'Descripción',
        'comercio':'Clave medida de comercialización',
        'tipo_moneda':'Tipo de moneda',
        'cantidad_comerc':'Cantidad de unidades de comercialización',
        'valor_unitario':'Valor unitario',
        'valor_total':'Valor total',
        'valor_total_dolares':'Valor total en dolares',
        'marca':'Marca',
        'modelo':'Modelo',
        'submodelo':'Submodelo',
        'numero_serie':'Número de serie',
        'clave_medida_comer':'Clave medida comer.'
    }
    

def __init__(self, *args, **kwargs):
    self.user = kwargs.pop('user')
    super().__init__(*args, **kwargs)     

def save(self, commit=True):
    self.instance.created_by = self.user
    self.instance.updated_by = self.user
    if self.instance.id is not None:
        self.instance.updated_by = self.user
    
    return super().save(commit=commit)

шаблон create.html

{% endblock %}

Примечание: имена переменных на испанском языке

Примечание: фиды, которые имеют значение: marca, modelo, submodelo, numero_serie

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