Как динамически вставить значение в 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 на текущую выбранную тему.

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