Django: Как получить динамически добавленные поля формы в чистом методе модели - PullRequest
0 голосов
/ 17 января 2020

Я довольно новичок в Django. Ниже приведено то, чего я пытаюсь достичь

Я добавляю некоторые поля в мою форму динамически на основе моделей (configurable_product_options_model), которые я получаю из представления. Моя идея состоит в том, чтобы использовать эти динамически добавленные поля для создания записи активации (ActivationRecord (models.Model)). Я не могу заполучить эти поля (ни одно из которых не сопоставляется с полями данных внутри моей модели [очевидно, это очевидно]) внутри функции очистки моей модели ActivationRecord, чтобы создать какую-то запись, которая будет сохранена в базе данных.

Вид

def activation_record(request):

    configurable_product_options_modeltouse = None 
    product_options_modeltouse = None

    if request.session['feature_name'] == "M-Vault" :
        product_options_modeltouse = MLink_Product_Options
        configurable_product_options_modeltouse = MLink_Configurable_Product_Options

    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:

        feature = request.session['feature_name']

        form = ActivationRecordForm (request.POST, product_options_model = product_options_modeltouse, 
                                     configurable_product_options_model = configurable_product_options_modeltouse)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # redirect to a new URL: 
            form.save()
            return redirect('/admin/sales_portal/activationrequest/')

    # if a GET (or any other method) we'll create a blank form
    else:

        form = ActivationRecordForm(initial={'feature_name' : request.session['feature_name'],
                                             'customer_reference' : request.session['customer_reference'],
                                             'host_method'  : request.session['host_method'],
                                             'host_id'      : request.session['host_id'],
                                             'activation_type' : request.session['activation_type']}, 
                                             product_options_model = product_options_modeltouse,
                                             configurable_product_options_model = configurable_product_options_modeltouse)

        # Disabled the populatd fieds in the ISODE activation record form
        form.fields['host_id'].widget.attrs['readonly'] = True

    return render(request, 'sales_portal/activation_record.html', {'form': form})

Форма

class ActivationRecordForm (ModelForm) :

def __init__(self, *args, **kwargs) :

    # Populate product options from the model based on the feature in the activation request

    product_options_model = kwargs.pop('product_options_model')
    configurable_product_options_model = kwargs.pop('configurable_product_options_model')

    super(ActivationRecordForm, self).__init__(*args, **kwargs)

    # Add product options in the form
    if product_options_model :
        self.fields['sub_feature'] = forms.ModelMultipleChoiceField(label='Product Options ', 
                                           required=False, 
                                           queryset = product_options_model.objects.all())

    # Add configurable product options in the form
    if configurable_product_options_model : 
        queryset = configurable_product_options_model.objects.all()
        for configurable_product_options in queryset :
            name = "%s " % configurable_product_options
            self.fields[name] = forms.CharField(required=False, 
                                           widget=forms.TextInput(attrs={'id':'CONFIGURABLE_PRODUCT_OPTION'}))

Внутри функции очистки модели ActivationRecord я хочу использовать данные заполнил эти динамически добавленные поля ("% s"% configurable_product_options). Я пытаюсь понять это сам (я уверен, что должен быть очень простой способ сделать это, но если кто-то может дать мне подсказку, я буду благодарен). Пробовал get_fields (), но он не перечисляет динамически добавленные поля в форме.

class ActivationRecord (models.Model) :
    def clean (self) :
    fields = self._meta.get_fields() 

1 Ответ

0 голосов
/ 17 января 2020

Я понял, что правильный способ сделать это (возможно) не в модели, а на мой взгляд. Идея состоит в том, чтобы получить объект модели, не сохраняя форму (commit = False), а затем модифицируя ее на основе настраиваемых параметров, прежде чем снова сохранять.

if request.method == 'POST':

    feature = request.session['feature_name']

    form = ActivationRecordForm (request.POST, product_options_model = product_options_modeltouse, 
                                 configurable_product_options_model = configurable_product_options_modeltouse)

    # check whether it's valid:
    if form.is_valid():

        queryset = configurable_product_options_modeltouse.objects.all()

        product_options = []

        for configurable_product_options in queryset :
            if form.cleaned_data["%s " % configurable_product_options] :
                val = str(configurable_product_options) # Get the label
                val = val.replace(" ", "") # Remove spaces from the label
                val = val.lower() # Make the label lowercase
                val = val+"="+str(form.cleaned_data["%s " % configurable_product_options])  
                product_options.append(val)

        # modify the activation record with the configurable product options before 
        # saving the form and redirecting to a new URL: 
        if product_options :
           activation_record_object = form.save(commit=False)
           activation_record_object.sub_feature = str(activation_record_object.sub_feature)+ "," + ",".join(product_options)

        form.save()
...