Django: Изменить форму / модель в соответствии с вводом пользователя - PullRequest
0 голосов
/ 09 мая 2020

У меня есть разные модели в классе и их подклассах - и я хочу создать форму для всех из них - я знаю, что могу сделать это с одной страницей для каждой из них, но есть ли разумный способ сделать это ?

models.py:

class ProductBase(models.Model):
    name = models.CharField('Name', max_length=120)
    price = models.DecimalField("Per part", decimal_places=2, max_digits=6)

class Software(ProductBase):
    link = models.URLField('Download Link', blank=True)

class Hardware(ProductBase):
    shipping_cost = models.DecimalField("UPS", decimal_places=2, max_digits=6)

forms.py:

class ProductForm(ModelForm):
    required_css_class = "required"

    class Meta:
        model = Product
        fields = "__all__"

views.py:

def add_part(request):
    submitted = False
    if request.method == "POST":
        form = ProductForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect("add_product/?submitted=True")
    else:
        form = ProductForm()
        if "submitted" in request.GET:
            submitted = True
    return render(request, "add_product.html", {"form": form, "submitted": submitted})

add_product. html:

{% extends 'base.html' %}
{% block content %}
    {% if submitted %}
        <p class="success">Part was saved successfully.</p>
    {% else %}
        <form action="" method="post" novalidate>
            <table>
                {{ form.as_table }}
                <tr><td><input type="submit" value="Submit"></td></tr>         
            </table>
            {% csrf_token %}
        </form>
    {% endif %}
{% endblock content %}

Таким образом я создаю форму для сохранения продукта в базе данных, вероятно, самым простым способом. Есть ли способ получить что-то вроде раскрывающегося меню, которое позволяет мне выбирать между software, hardware и None.

После того, как я выбрал тип, я хотел бы показать пользователю соответствующие атрибуты и сохраните их в базе.

...