Используйте 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