Как динамически вставить значение в Django ModelForm
У меня есть проект, в котором пользователи могут создать компанию. Однако, есть тема, которая должна быть динамически вставлена, как только пользователь выбирает тему на фронтенде - больше похоже на то, когда вы хотите выбрать шаблон в no-code builder. Ниже представлен мой models.py
class Theme(models.Model):
name = models.CharField(max_length=100, null=True)
image = models.ImageField(upload_to='static/images/themes_images', null=True, blank=True)
category = models.CharField(max_length=200, choices=CATEGORY_CHOICES, null=True)
class Company (models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, editable=False)
date_created = models.DateField(default=timezone.now, null=True)
company_name = models.CharField(max_length=100, null=True)
theme = models.ForeignKey(Theme, on_delete=models.CASCADE, null=True, blank=True)
Что касается модели темы, то ее будет создавать только администратор, а пользователю останется только выбрать ее на фронт-энде. Это похоже на выбор готового шаблона в Weebly. Все тематические объекты будут иметь свою собственную страницу, где пользователь сможет визуально увидеть, какую тему выбрать:
@login_required(login_url='login')
def theme(request):
themes = Theme.objects.all()
context = {'themes': themes}
return render(request, 'themes.html', context)
Я не так много сделал с видом, потому что не уверен, как действовать, чтобы достичь желаемого результата.
Themes.html
{% extends 'index.html' %}
{% load static %}
{% block 'title' %} <title>Themes | Simpledocs</title> {% endblock %}
{% block content2 %}
{% endblock %}
{% block content %}
<h2 class="my-4">Choose your theme</h2>
<div class="columns">
{% for t in themes %}
<div class="column is-4">
{{t.name}}<br>
<img src = "/{{t.image}}" height="150px" width="150"/><be>
{{t.category}}<br>
<a class="button" href="#">Choose Theme</a>
</div>
{% endfor %}
</div>
{% endblock %}
Так что при нажатии на вышеуказанное представление пользователь должен иметь возможность выбрать тему и применить ее динамически в модели Company на записи темы. Я никогда не сталкивался с такой задачей и нуждаюсь в помощи.
На самом деле это просто. Решение найдено.
Создайте другое представление, которое показывает отдельные темы:
{% extends 'index.html' %}
{% load static %}
{% block 'title' %} <title>Themes | Simpledocs</title> {% endblock %}
{% block content2 %}
{% endblock %}
{% block content %}
<h2 class="my-4">Choose your theme</h2>
<div class="columns">
{{single_theme.name}}<br><br>
<img src="/{{single_theme.image}}" /><br><be>
{{single_theme.category}}<br>
<form method="POST">
{% csrf_token %}
<button class="button">Choose Theme</button>
</form>
</div>
{% endblock %}
Создайте еще одно представление, демонстрирующее тему. И выполните изменение записи Company.theme.
@login_required(login_url='login')
def theme_single(request, pk):
single_theme = Theme.objects.get(id=pk)
company = Company.objects.all()
if request.method == 'POST':
for c in company:
c.theme = single_theme
c.save()
return redirect('company')
context = {'single_theme':single_theme}
return render(request, 'theme_single.html', context)
Это изменит запись модели company.theme на текущую выбранную тему.